• Python可视化之Matplotlib


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    1、解决坐标轴刻度负号乱码

    plt.rcParams['axes.unicode_minus']=False
    
    • 1

    2、解决中文乱码问题

    # 以下方式二选一
    plt.rcParams['font.sans-serif']=['Simhei']
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 
    
    • 1
    • 2
    • 3

    3、图形展现形式

    jupyter notebook中有2种图形展现形式
    %matplotlib notebook:运行这句命令会在notebook中启动交互式图形
    %matplotlib inline:运行这句命令会在notebook中启动静态图形
    如果没有运行该命令,默认展示静态图形

    %matplotlib notebook
    %matplotlib inline
    
    • 1
    • 2

    一、图形绘制

    1.折线图plot

    • 展现变量的趋势变化
    • 调用方式:plt.plot(x,y,ls=‘-’,lw=w,label=‘plot figure’)
    • 参数:
      x:x轴的数值
      y:y轴的数值
      ls:折现图的线条风格(linestyle)
      lw:折现图的线条宽度(lineweight)
      label:标记图形内容的标签文本
      color:图形颜色
    x=np.linspace(0.05,20,200)
    y=np.sin(x)
    
    fig = plt.figure()#创建一个图形(画板)
    plt.plot(x,y,ls='--',lw=2,label='sin(x)',color='r')#调用画图函数画图(类似于在画板上贴画纸进行绘画)
    plt.legend()  #legend将标签显示出来
    plt.show()
    fig.savefig('test.png')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.散点图plot&scatter

    • plt.plot()
    x=np.linspace(0,10,30)
    y=np.sin(x)
    
    plt.plot(x,y,marker='o',color='c')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    • plt.scatter()比plt.plot()更加灵活,比如可以单独空值每个散点与数据匹配,也可以让每个散点具有不同的属性
      函数功能:寻找变量之间关系
      调用方式plt.scatter(x,y,c=‘b’,label=‘scatter,figure’)
      x:x轴数值
      y:y轴数值
      c:散点标记颜色
      label:标签文本
    x=np.random.randn(100)
    y=np.random.randn(100)
    plt.scatter(x,y,c='c',label='散点图')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    x=np.random.randn(100)
    y=np.random.randn(100)
    colors=np.random.randn(100)
    size=np.random.randint(20,500,100)
    plt.scatter(x,y,c=colors,s=size,alpha=0.3,cmap='hsv')
    plt.colorbar()  #显示颜色条
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    3.柱状图plt.bar&条形图plt.barh

    函数功能:在x轴上绘制定性数据的分布特征,调用方式:plt.bar(x,y),与之相对应的是条形图
    参数

    • x:在X轴上的定性数据类别
    • y:每种定性数据类别数量
    • align:柱体对齐方式
    • color:柱体颜色
    • tick_label:刻度标签值
    • alpha:柱体透明度
    • hatch:柱体填充样式
    x=[i for i in range(6)]
    y=np.random.randint(45,100,6)
    z=('a','b','c','d','e','f')
    plt.ylabel('数据')
    plt.bar(x,y,align='center',color='c',tick_label=z,hatch='///')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    4.直方图plt.hist&堆积直方图

    函数功能:在X轴绘制定量数据的分布特征
    参数说明
    x:在X轴上绘制箱体的定量数据输入值
    bins:用于确定柱体的个数或柱体边缘范围,除了最后一个柱体作用都为闭区间,其他柱体为左闭右开区间
    color:柱体颜色
    histype:柱体类型

    • bar:传统的条形直方图,如果是多个数据给出并排排列的条形图
    • step:生成默认的线图填补
    • stepfilled:生成默认的线图填充
      label:图例内容
      rwidth:柱体宽度
    x=np.random.normal(loc=10000,scale=3000,size=1000)
    bins=range(0,20000,500)
    
    plt.hist(x,bins=bins,histtype='bar',color='c',alpha=0.6)
    plt.xlabel('test')
    plt.ylabel('数据')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    堆积直方图和直方图相比,多添加2个参数
    x:参数X需要对应两个数据对象,可以用列表装载
    stacked:true即两个直方图堆积,false表示两个直方图并列
    label:因为展示两类数据,所有标签需额外设置

    x0=np.random.normal(loc=10000,scale=3000,size=1000)
    x1=np.random.normal(loc=7000,scale=3000,size=1000)
    bins=range(0,20000,500)
    x=(x0,x1)
    plt.hist(x,bins=bins,histtype='bar',label=['x0','x1'],stacked=True,alpha=0.6)
    plt.xlabel('test')
    plt.ylabel('数据')
    plt.legend(loc='upper right')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    当stacked=False时:
    在这里插入图片描述

    5.饼图plt.pie

    主要参数
    x:定性数据的不同类别的百分比
    explode:饼片边缘偏离半径的百分比(如果制作分裂式饼图,添加该参数即可)
    labels:标记每份饼片的文本标签内容
    autopct:饼片文本标签内容对应的数值百分比样式
    startangle:从X轴起始位置开始,第一个饼片逆时针旋转的角度
    shadow:是否绘制饼片的阴影
    colors:饼片的颜色
    其他参数:
    pctdistance:每个饼片中心与开始之间的比率,默认值为0.6
    labeldistance:绘制饼图标签的径向问题距离,默认1.1

    percent='0.1','0.15','0.3','0.2','0.2','0.05'
    explode=0.1,0.1,0.1,0.1,0.1,0.5  #如果突出某部分,可把对应值修改
    autopacts="%.2f%%"
    startangle=45
    types='优','良','中','一般','次','差'
    colors=['r','g','b','c','y','y']
    plt.pie(x=percent,explode=explode,labels=types,autopct=autopacts,startangle=startangle,colors=colors)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    不传explode参数时
    在这里插入图片描述

    6.单个、多个箱线图boxplot

    箱体由第一四分位、中位数(第二四分位)和第三四分位数组成,箱须末端之外为离群值
    参数:
    x:输入数据
    whis:四分位距的倍数,用来确定箱须,包括数据范围大小
    widths:设置箱体宽度
    sym:离群值的标记样式
    labels:绘制每一个数据集的刻度标签
    patch_artist:是否给箱体添加颜色
    notch:如果为True,则箱体由凹痕

    • 单个箱线图
    x=np.random.randn(1000)
    plt.boxplot(x=x,whis=1.5,widths=0.3,sym='o',labels=['箱体图'],notch=False)
    plt.grid(axis='y',ls=':',lw=1,color='grey',alpha=0.4)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    • 多个箱线图
      数据集参数X需传入多个数据集对象
      标签参数labels列表要包含多个标签字符串
      在这里插入图片描述

    二、绘图风格设置

    1.图片保存及查看

    x=np.linspace(0.05,20,200)
    y=np.sin(x)
    
    fig = plt.figure()#创建一个图形(画板)
    plt.plot(x,y,ls='--',lw=2,label='sin(x)',color='r')#调用画图函数画图(类似于在画板上贴画纸进行绘画)
    plt.legend()  #legend将标签显示出来
    plt.show()
    fig.savefig('test.png')
    
    from IPython.display import Image
    Image('test.png')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    2.设置坐标轴上下限

    plt.xlim:设置X轴范围
    plt.ylim:设置y轴范围

    x=np.linspace(0.05,20,200)
    y=np.sin(x)
    
    fig = plt.figure()#创建一个图形(画板)
    plt.plot(x,y,ls='--',lw=2,label='sin(x)',color='r')#调用画图函数画图(类似于在画板上贴画纸进行绘画)
    plt.legend()  #legend将标签显示出来
    plt.xlim(0.1,20)
    plt.ylim(-2,2)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    3.axis获取或设置某些轴的便捷方法

    • 使用方法一:plt.axis(xmin,xmax,ymin,ymax)
      xmin:x轴最小取值范围
      xmax:x轴最大取值范围
      ymin:y轴最小取值范围
      ymax:y轴最大取值范围
      在这里插入图片描述
      在这里插入图片描述

    • 使用方法二:plt.axis(str)
      ‘on’:打开轴线和标签
      ‘off’:关闭轴线和标签。等于设置相等的缩放比例,改变轴限制
      ‘scaled’:设置相等的缩放比例,改变绘图狂尺寸
      ‘tight’:设置限制大小足以显示所有数据
      ‘auto’:自动缩放(带数据的填充框)
      在这里插入图片描述

    4.轴标签xlabel(),ylabel()

    xlabel()函数功能:设置X轴标签文本
    调用方式:plt.xlabel(string)
    string:标签文本内容
    fontsize:字体大小
    平移性:上面的函数功能,调用签名和参数说明同样可以平移到函数ylabel上
    在这里插入图片描述

    5.文本标签图例legend()

    函数功能:标识不同图形的文本标签图例
    调用方式:plt.legend(loc=‘lower left’)
    主要参数:

    • loc:图例在图中的地理位置
      upper right(右上角)、upper left(左上角)、upper center(中间靠上)
      lower left(左下角)、lower right(右下角)、lower center(中间靠下)
      center(中间)、center right(中间靠右)、center left(中间靠左)
    • title:图例标签内容标题参数
    • shadow:线框阴影,True或False
    • fancybox:线框圆角处理参数,True或False
      在这里插入图片描述

    6.设置轴刻度和刻度标签

    通过plt.xticks()和plt.yticks()函数给x轴和y轴设定刻度,同时通过这2给函数中的label参数来给这些刻度贴上标签
    在这里插入图片描述
    在这里插入图片描述

    7.网格线设置grid()

    函数功能:绘制刻度线的网格线
    调用方式:plt.grid(linestyle=‘:’,color=‘’)
    在这里插入图片描述

    8.参考线axhline()

    函数功能:绘制平行于x轴的水平参考线,与之对应的方法为plt.axvline()
    调用方式:plt.axhline(y=0,c=‘r’,ls=‘:’,lw=‘’)
    y:水平参考线的出发点
    c:参考线的线调颜色
    ls:参考线的线条风格
    lw:参考线的线条宽度
    在这里插入图片描述

    9.参考区域axvspan()

    函数功能:绘制垂直于x轴的参考区域,与之相应的函数为axhspan()
    调用方式:plt.axvspan(xmin=1.0,xmax=2,facecolor=‘y’,alpha=0.3)
    xmin:参考区域起始位置
    xmax:参考区域终止位置
    facecolor:参考区域填充颜色
    alpha:参考区域填充颜色的透明度
    在这里插入图片描述

    10.指向性注释annotate()

    函数功能:添加图形内容细节的指向型注释文本
    调用方式:plt.annotate(string,xy=(,),xytext=(,),color=‘b’,arrowprops=dict(arrowstyle=‘->’,color=‘b’)
    string:图形内容的注释文本
    xy:被注释图形内容的位置坐标
    xytext:注释文本的位置坐标
    color:注释文本的字体颜色
    arrowprops:指示被注释内容的箭头的字典属性:

    • arrowstyle:‘-’,‘->’,‘-[’,‘|-|’,‘-|’,‘<-’,‘<->’,‘<|-’,‘<|-|>’,fancy,simple,wedge(注释文本字体粗细)
    • color:颜色
    plt.annotate('测试说明',xy=(np.pi/2,1),xytext=(2.5,1),weight='bold',
                 color='r',arrowprops=dict(arrowstyle='->',color='c'))
    
    • 1
    • 2

    在这里插入图片描述

    11.text()图形内容细节的无指向注释文本

    调用方式:plt.text(x,y,string,weight=‘bold’,color=‘b’)
    x:注释文本位置横坐标
    y:注释文本位置纵坐标
    string:文本内容
    weight:字体大小
    color:字体颜色

    plt.text(2,0.8,'sin(x)曲线',fontsize='12',color='c')
    
    • 1

    在这里插入图片描述

    12.title()添加图形内容标题

    调用方式plt.title(string)
    string:标题文本
    loc:center/left/right
    fontdict:可以用字典存储,包含以下参数:

    • family:字体类别
    • size:字体大小
    • color:字体颜色
    • style:字体风格
    plt.title('y=sin(x)',color='r',loc='center',fontsize=13)
    
    • 1

    在这里插入图片描述

    三、绘图进阶

    1.子图plt.subplot

    subplot(C,R,P):划分C行P列,从最左上角向右数起,序号P依次增加,直到换一行,序号页是从左向右增加

    x=np.linspace(-2*np.pi,2*np.pi,200)
    y1=np.sin(x)
    y2=np.cos(x)
    y3=x
    y4=x**2
    
    plt.subplot(221)
    plt.plot(x,y1,label='sin(x)')
    
    plt.subplot(222)
    plt.plot(x,y2,label='cos(x)')
    
    plt.subplot(223)
    plt.plot(x,y3,label='x')
    
    plt.subplot(224)
    plt.plot(x,y4,label='x**2')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.子图plt.subplots

    plt.subplots()其实会返回两个对象,一个是figure画布实例,一个是坐标轴实例axes

    • figure:可以看作一个图形实例,用来包括坐标轴,图形,文字标签等
    • axes:表示一个坐标轴实例,是一个带有刻度和标签的矩阵
    • 先有了figure、axes,就可以使用ax.plot进行绘图了
      因为ax[0]表示第一个子图的实例,ax[1]表示第二个子图实例,所有可以通过ax[0]回到第一个子图绘图
      在这里插入图片描述
    fig,ax=plt.subplots(2,1) # 把fig想象成一块画板,ax想象成两张画纸
    x=np.linspace(-2*np.pi,2*np.pi,200)
    y_01=np.sin(x)
    y_02=x**2
    ax[0].plot(x,y_01,label="sin(x)") 
    ax[0].legend()
    ax[0].set_title("图一")
    ax[1].plot(x,y_02,label="x**2")
    ax[1].legend()
    ax[1].set_title("图二")
    #如果在画完两幅子图之后,在这个时候想再往图一添加折线图y=x,可以直接通过实例ax[0].plot()来画:
    ax[0].plot(x,x,color="r",ls="--",alpha=0.3)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.plt.figure

    语法:plt.figure(num, figsize, dpi, facecolor, edgecolor, frameon)
    参数

    • num:整数或字符串,可选,默认值:无
      如果未提供,将创建新图形和图形编号。图形对象将此数字保存在“数字”中
      如果提供了num,将在该编号的图形中绘图;如果num是一个字符串,该字符串作为图标题。
    • figsize:整数元组,可选,默认值:无;[宽度,高度](英寸);如果未提供,则默认为[6.4,4.8]
    • dpi:整数,可选,默认值:无;这个数字的分辨率。如果未提供,则默认为100
    • facecolor:背景颜色。如果未提供,则默认为"w"。
    • edgecolor:边框颜色。如果未提供,则默认为"w"。
    • frameon:布尔型,可选,默认值:True。如果为False,则禁止绘制图框。
    fig_01=plt.figure(1,figsize=[3,3]) #建立“画布1”
    ax_01=plt.axes() 
    fig_02=plt.figure(2,figsize=[2,2]) #建立“画布2”
    ax_02=plt.axes() 
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4.plt.axes

    plt.axes用来创建一个新的全窗口轴:
    语法:plt.axes([left, bottom, width, height]…)
    以左下角为原点,右上角为1,设置轴域的[左坐标,底坐标,宽度,高度]

    • 上面的轴域取值范围是左下角(原点)为0,右上角为1。
    • 左坐标和底坐标两个参数对应的就是——该坐标轴的原点位置,为该图形宽度和高度比例。
    • 宽度和高度的参数就是——该坐标轴原点往外扩展,宽度和高度为图形的比例长度。
    x=np.linspace(-2*np.pi,2*np.pi,200)
    y=np.sin(x)
    
    fig=plt.figure(1,facecolor="gray") #建立“画布1”,设为灰色
    ax_1=plt.axes([0,0,0.4,0.4],facecolor="w") #轴域(画纸)颜色设置成白色
    ax_1.plot(x,y,ls="-.",color="r")
    ax_2=plt.axes([0.4,0.4,0.6,0.6],facecolor="b") #轴域(画纸)颜色设成绿色
    ax_2.plot(x,y,ls="-",color="c")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    5.其他建立figure、axes方法

    1)通过plt.subplots

    x=np.linspace(0,10,1000)
    y=np.sin(x)
    fig,((ax_01,ax_02),(ax_03,ax_04))=plt.subplots(2,2) # 通过plt.subplots()返回“画板”和“画纸”
    ax_01.plot(x,y)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    2)通过plt.add_subplot

    fig = plt.figure() # 先创建“画板”
    ax_01 = fig.add_subplot(221) # 通过“画板”来调用“画纸”
    ax_01.plot(x,y)
    ax_02 = fig.add_subplot(222)
    ax_03 = fig.add_subplot(223) 
    ax_04 = fig.add_subplot(224)
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    6.面向对象绘图

    1)折线图ax.plot

    x=np.linspace(-2*np.pi,2*np.pi,200)
    y=np.sin(x)
    fig = plt.figure()
    ax = plt.axes()
    ax.plot(x,y,ls='--',color='c',label='test')
    ax.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2)散点图ax.scatter

    fig = plt.figure()
    ax = plt.axes()
    
    x=np.linspace(0.05,20,500)
    y=np.random.randint(1,100,500) 
    # ax.scatter(x,y,label="scatter figure")
    # ax.legend()
    plt.scatter(x,y,label="scatter figure")
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    3)柱状图ax.bar

    fig = plt.figure()
    ax = plt.axes()
    
    x=[i for i in range(1,6)] 
    y= np.random.randint(45,100,5) 
    z=("a","b","c","d","e") 
    ax.set_ylabel("text") 
    ax.grid(linestyle="-.",color="r",axis="y",alpha=0.15) 
    ax.bar(x,y,align="center",color="c",tick_label=z,hatch="|")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    4)plt和ax部分区别

    1、绝大多数plt函数都可以直接转换成ax方法,比如plt.plot()–>ax.plot()、plt.legend()–>ax.legend()等。
    2、在设置坐标轴上下限、坐标轴标题和图形标题方面,会稍有不同:

    • 设置坐标轴标题:
      plt.xlabel()–>ax.set_xlabel()
      plt.ylabel()–>ax.set_ylabel()
    • 设置坐标轴上下限:
      plt.xlim()–>ax.set_xlim()
      plt.ylim()–>ax.set_ylim()
    • 设置图形标题:
      plt.title()–>ax.set_title()
      3、使用面向对象的方式绘制气泡图,不能设置colorbar,不加colorbar()就不会报错
  • 相关阅读:
    2022-04-25-ElasticSearch
    【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法
    条件不一致的动态运算
    【Python3】基础 - 基本数据类型
    【Verilog】HDLBits题解——Circuits/Basic Gates
    多维数组(二维数组)
    Oracle + MyBatis 批量更新 update
    前端设计模式之【工厂模式】
    实时多人关键点检测系统:OpenPose | 开源日报 0907
    值得收藏的30道Python练手题(附详解)
  • 原文地址:https://blog.csdn.net/YBK233/article/details/137358222