美文网首页数据分析
[Python] Matplotlib相关知识

[Python] Matplotlib相关知识

作者: 半为花间酒 | 来源:发表于2020-05-17 21:04 被阅读0次

内容是以前的学习笔记,内容不全,主观性较大,部分基础知识未展示

Matplotlib

  1. 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;
  2. 联系:查看两个或两个以上变量之间的关系,比如散点图;
  3. 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
  4. 分布:关注单个变量,或者多个变量的分布情况,比如直方图
# Jupyter运行matplotlib
%matplotlib inline

颜色 color

  • ‘b’:蓝色(blue)
  • ‘g’:绿色(green)
  • ‘r’:红色(red)
  • ‘c’:青色(cyan)
  • ‘m’:品红(magenta)
  • ‘y’:黄色(yellow)
  • ‘k’:黑色(black)
  • ‘w’:白色(white)

线型 linestyle

  • ‘-‘:实线(solid line style)
  • ‘–‘:虚线(dashed line style)
  • ‘-.’:点划线(dash-dot line style)
  • ‘:’:点线(dotted line style)

标记点 marker

  • ‘.’:点(point marker)
  • ‘,’:像素点(pixel marker)
  • ‘o’:圆形(circle marker)
  • ‘v’:朝下三角形(triangle_down marker)
  • ‘^’:朝上三角形(triangle_up marker)
  • ‘<‘:朝左三角形(triangle_left marker)
  • ‘>’:朝右三角形(triangle_right marker)
  • ‘1’:(tri_down marker)
  • ‘2’:(tri_up marker)
  • ‘3’:(tri_left marker)
  • ‘4’:(tri_right marker)
  • ‘s’:正方形(square marker)
  • ‘p’:五边星(pentagon marker)
  • ‘*’:星型(star marker)
  • ‘h’:1号六角形(hexagon1 marker)
  • ‘H’:2号六角形(hexagon2 marker)
  • ‘+’:+号标记(plus marker)
  • ‘x’:x号标记(x marker)
  • ‘D’:菱形(diamond marker)
  • ‘d’:小型菱形(thin_diamond marker)
  • ‘|’:垂直线形(vline marker)
  • ‘_’:水平线形(hline marker)

绘图基础

plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决符号问题

plt.plot(x,y,
        ls=, # 线条风格
        lw=2, # 线条宽度
        c=, # 线条颜色
        marker=, # 线条上点的形状
        markersize=, # 线条上点的大小
        markeredgecolor=, # 点的边框色
        markerfacecolor=, # 点的填充色
        label=) # 文本标签
plt.grid(ls='--',
         c='darkblue') # 设置网格线
plt.axhline(y=1700,
            c='red',
            ls='--'
            lw=2) # 设置平行于x轴的参考线
plt.axvline(x=4,
            c='steelblue',
            ls='-.',
            lw=2) # 设置平行于y轴的参考线
plt.axvspan(xmin=4,
            xmax=6,
            facecolor='r',
            alpha=0.3) # 设置平行于y轴的参考区,同理axhspan
plt.show()

图例

plt.plot(x,y,label='label')
plt.legend(loc='upper left', # 最好选择best自动匹配
           fontsize=10,
           frameon=False) # 图例是否有边框
fig = plt.gcf() # 返回一个图像设置对象
fig.set_size_inches(12.5, 10.5) # 设置图像大小
plt.show()

子图

fig = plt.figure(figsize=(10, 5))  # 创建画布可以设置大小
ax1 = fig.add_subplot(1, 2, 1) # 设置子图,1行2列第1个
ax2 = fig.add_subplot(1, 2, 2, sharey=ax1) # 1行2列第2个,且两个子图共享y轴

# 会员直方图
ax1.hist(year_member_duration, range=hist_range, bins=n_bins) 
# 设置范围和分组个数
ax1.set_xticks(range(0, 181, 15))
ax1.set_title('Member')
ax1.set_ylabel('Count')

# 非会员直方图
ax2.hist(year_casual_duration, range=hist_range, bins=n_bins)
ax2.set_xticks(range(0, 181, 15))
ax2.set_title('Casual')
ax2.set_ylabel('Count')

plt.tight_layout()
plt.show()

饼状图

plt.figure()
plt.pie(n_users,
        colors= ['c', 'b'], # 颜色
        labels=['above zero', 'minus'], # 文本标签
        labaldistance=1.2, # 文本标签设置在饼图外
        textprops={'fontsize':10,
                   'color':'black'} # 设置文本属性
        autopct='%.1f%%', # 计算百分比
        shadow=True, # 阴影
        explode=(0.05, 0.05),# 分离
        pctdistance=0.5,# 百分比标签和圆心距离
        wedgeprops={'linewidth':1.5,
                    'edgecolor':'green'} # 设置饼图边界的属性
        ) 
plt.axis('equal') # 横纵坐标一样,形成正圆
plt.title('Title', pad=30) # 标题与图的距离
plt.tight_layout()
plt.show()

折线图

plt.figure()
plt.plot(results[0],linestyle='-', marker='o', label='count')
plt.plot(results[1],linestyle='-.', marker='h', label='max')
plt.plot(results[2],linestyle='--', marker='^', label='min')
plt.plot(results[3],linestyle=':', marker='*', label='mean')
# 可以通过一个函数直接画出多个折线
plt.xticks(range(0, 3), ['Jan.', 'Feb.', 'Mar.'], rotation=45)
# 修改x轴刻度变成标签
plt.xlabel('Month')
plt.ylabel('Describe')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

# 时间序列分析用折线图较多
plt.figure(figsize=(10, 8))
plt.plot(x1,y1,'bs--', # color、marker、ls可以合并简写
         x2,y2,'ro--',
         x3,y3,'gH--')
plt.xlabel('Month',lablepad=25)
plt.ylabel('Describe')
plt.xticks(range(0, 4, 1), 
           ['Jan.', 'Feb.', 'Mar.', 'Apr'], 
           rotation=45,
           fontsize=10)
plt.legend(['first','Second','Third'],
           loc='upper right',
           ncol=1, # 排列成一行
           frameon=False)


# seaborn折线图
import pandas as pd
import seaborn as sns
# 数据准备
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Seaborn画折线图
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
# 几乎和matplotlib无区别

柱状图

plt.figure(figsize=(6.4, 4.8))
plt.bar(x,
        height=, # 纵轴数据
        width=0.5,
        color='y',
        linewidth=,
        tick_label=x_data, # 横坐标标签
        align='center') # 标签对齐方式 
plt.xlabel('Month', labelpad=20)
plt.ylabel('Describe', fontsize=15)
plt.title('Title', pad=20)
plt.show()

# 画堆叠柱状图,需要先做透视图
plt.bar(x, height=data1, color='red', label=l1, tick_label)
plt.bar(x, height=data2, color='blue', label=l2, tick_label,
        bottom=data1)
plt.bar(x, height=data3, color='green', label=l3, tick_label,
        bottom=data1+data2) # 画在最上面
plt.legend(loc='best') # 各图的label
# 也可以把图例放外面
plt.legend(bbox_to_anchor=(1.1,0.8)) 
# 把整个图的横纵坐标视为1,1.08为距左的距离,0.8为距下的距离
plt.ylabel('ylabel')
plt.title('title')
plt.show()

# 也可以先做交叉表求比例再画均一化堆叠柱状图

# 分组柱状图 + 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决符号问题
bar_locs = np.arrange(4)
bar_width = 0.35 # 柱子宽度

plt.figure()
plt.bar(bar_locs,
        member,
        width=bar_width,
        color='g',
        alpha=0.7,
        laber='会员')
plt.bar(bar_locs+bar_width, # 设置偏移量为柱子宽度
        casual,
        width=bar_width,
        color='g',
        alpha=0.7,
        laber='非会员')
xtick_labels = [f'第{i+1}季度' for i in range(4)]
plt.xticks(bar_locs+bar_width/2, # 让刻度位置居中
           xtick_labels,
           rotation=45)
plt.ylabel('平均骑行时间')
plt.title('柱状图')
plt.legend(loc='best')
plt.tight_layout()
plt.savefig('..')
plt.show()


# seaborn条形图
import seaborn as sns
# 数据准备
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Seaborn画条形图
sns.barplot(x, y)
plt.show()
# 自带颜色划分

直方图

plt.figure(figsize=(10, 5))  # 创建画布可以设置大小
plt.hist(x=Titanic['Age'], 
         range=hist_range, 
         bins=n_bins, # 柱个数
         edgecolor='red',
         density=True) # 频数还是频率
plt.set_xticks(range(0, 181, 15))
plt.set_title('Casual')
plt.set_ylabel('Count')
plt.tight_layout()
plt.show()

# 加上正态分布图与核密度图
def normfun(x, mu, sigma):
    pdf = np.exp(-((x-mu)**2/(2*sigma*2))/(sigma*np.sqrt(2*np.pi))
    return pdf
                 
mean_x = Titanic['Age'].mean() # 平均值
std_x = Titanic['Age'].std() # 标准差
x = np.arange(Titanic['Age'].min(), Titanic['Age'].max()+10, 1)
y = normfun(x, mean_x, std_x)
                 plt.figure(figsize=(10, 5))  # 创建画布可以设置大小
                 
plt.hist(x=Titanic['Age'], 
         range=hist_range, 
         bins=n_bins, # 柱个数
         edgecolor='red',
         density=True) # 频数还是频率
plt.plot(x, y, color='g', lw=3, label='正态分布图')
Titanic['Age'].plot(kind='kde',color='red',xlim=[0,90],label='核密度图')   
plt.set_xticks(range(0, 181, 15))
plt.set_title('Casual')
plt.set_ylabel('Count')
plt.tight_layout()
plt.show()
 
                 
# seaborn直方图
# 可直接画直方图和核密度图
import numpy as np
import pandas as pd
import seaborn as sns
# 数据准备
a = np.random.randn(100)
s = pd.Series(a) 
# 用Seaborn画直方图
sns.distplot(s, kde=True)
plt.show()

散点图

plt.figure(figsize=(10,8)) # 常用大小
plt.scatter(x,y,
            s=, # 散点大小
            c=,# 散点颜色
            marker=, # 散点形状
            alpha=, # 散点透明度
            linewidths=, # 散点边界线宽度
            edgecolors=) # 散点边界线颜色

plt.scatter(x,y,s=10,color='steelblue')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('title')
plt.show()

# 需要把同一列不同组的值在散点图上分开体现,可以用循环
color_lst = ['steelblue','indianred','green']
species_lst = ['setosa','versicolor','virginica']
marker_lst = ['x','o','s']

for i in range(0,3):
    plt.scatter(x=df.width[df['species']==species_lst[i]],
                y=df.length[df['species']==species_lst[i]],
                color=color_lst[i],
                marker=marker_lst[i],
                label=species_lst[i])
plt.legend(loc='best')
plt.xlabel('xlabel',fontsize=12,labelpad=20)
plt.ylabel('ylabel',,fontsize=12,labelpad=20)
plt.title('title')
plt.show()


# seaborn散点图
import numpy as np
import pandas as pd
import seaborn as sns
# 数据准备
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Seaborn画散点图
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()
# 散点图呈正方形,且上和右为x和y的分布图

箱线图

plt.boxplot(x,
           width:宽度
           labels:x轴标签
           patch_artist:是否填充箱体颜色
           meanline:是否显示均值线
           showmeans:是否显示均值
           Meanprops:设置均值属性 字典
           medianprops:设置中位数属性 字典
           showfliers:是否显示异常值
           flierprops: 异常值的属性 字典
           boxprops:设置箱体属性 字典
           capprops:设置箱体末端和顶端线条属性 字典)

plt.figure(figsize=(16,9))
plt.boxplot(x,patch_artist=True,showmeans=True,showfliers=True,
            boxprops={'color':'black','facecolor':'steelblue'},
            flierprops={'marker':'o','markerfacecolor':'red','markersize'=5},
            meanprops={'marker':'D','markerfacecolor':'indianred','markersize'=4},
            medianprops={'color':'orange','linestyle':'--'})
plt.title('title')
plt.show()


# seaborn箱线图
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
# 生成0-1之间的10*4维度数据
data=np.random.normal(size=(10,4)) 
lables = ['A','B','C','D']
# 用Matplotlib画箱线图
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn画箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()

热图

import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
flights = sns.load_dataset("flights") # 自带数据集
data=flights.pivot('year','month','passengers')
# 用Seaborn画热力图
sns.heatmap(data)
plt.show()

雷达图

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
# 数据准备
labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"])
stats=[83, 61, 95, 67, 76, 88]
# 画图数据准备,角度、状态值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib画蜘蛛图
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)   
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 设置字体
font = FontProperties(size=14) # 设置字体大小
ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
plt.show()

Seaborn图和多变量

# 二元变量
import seaborn as sns
# 数据准备
tips = sns.load_dataset("tips")
print(tips.head(10))
# 用Seaborn画二元变量分布图(散点图,核密度图,Hexbin图)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')  # 直方图的二维模拟
plt.show()


# 多个成对双变量
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
iris = sns.load_dataset('iris')
# 用Seaborn画成对关系
sns.pairplot(iris)
plt.show()

相关文章

网友评论

    本文标题:[Python] Matplotlib相关知识

    本文链接:https://www.haomeiwen.com/subject/sdkeohtx.html