Python数据可视化三部曲之 Matplotlib 从上手到上头


Python数据可视化三部曲 Matplotlib 从上手到上头


文章目录

  • –安装命令–
  • 1.plot()方法基本
  • 1.1 方法概述
  • 1.2 不设置x时
  • 1.3 x中元素的顺序
  • 2.设置坐标轴范围 plt.xlim() & plt.ylim()
  • 3.设置坐标标签 plt.xticks() & plt.yticks()
  • 4.负号正常显示 与 中文正常显示 问题
  • 5. 设置坐标 标签 plt.xlabel() & plt.ylabel()
  • 6.增加标题 plt.title()
  • 7.增加图例 和 网格 plt.legend() & plt.grid()
  • 8. 设置样式(颜色,线条,标记)
  • 8.1 线条颜色 color
  • 8.2 线条样式 linestyle
  • 8.3 标记样式 maker
  • 8.4 线条宽度 linewidth
  • 8.5 标记的样式
  • 8.6 样式使用示例
  • 9.面向对象绘图
  • 9.1 面向对象绘图 – 创建画布对象
  • 9.2 创建Axes对象
  • 9.3 常用面向对象绘图方法
  • 10.matplotlib进阶学习
  • (一)给图像添加 文本标签 与 注释
  • (二)subplots_adjust()方法解决图表与画布的间距问题
  • (三)直方图的绘制
  • (四)单柱柱形图与多柱柱形图的绘制
  • (五)绘制饼形图专题(从一般饼状图到内嵌环形图)
  • (六)绘制面积图&热力图
  • (七)绘制箱线图 与 异常值的输出
  • (八)双y轴图像实现
  • (九)绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)
  • (十)绘制渐变色扇形图 -基于 颜色地图plt.cm模块儿
  • (十一)实现 等高线图

  •       ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ
                     请添加图片描述请添加图片描述请添加图片描述
        ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ


    大家好,我是侯小啾!
      本次blog,将为大家串讲一遍python的三大数据可视化库之一 —— matplotlib库。本篇博客侧重于基本功与面向对象绘图,更多细节小啾将在其他blog中分块儿呈现。


    –安装命令–

    pip install matplotlib


    1.plot()方法基本

    1.1 方法概述

    plot()方法是最常用的方法之一,Matplotlib绘图基本主要使用plot()函数。其通常用来绘制折线图,也可以用来绘制散点图。
    因为plot()方法的构造过于复杂,很难一次将所有的参数将清楚。所以这里分块进行,按照功能来一步一步解析。plot()每多设定一个参数,每多一个plt命令,图像就会多一部分细节。

    plot(x,y,format_string,**kwargs)

    这里暂先展示一小部分参数,
    其中

    参数x
    x 指x轴的数据 可以是一个列表,元组,Series等。也可以是range对象。

    参数y
    指的y轴的数据,可以选择的格式同x:可以是一个列表,元组,Series等。也可以是range对象。。

    参数format_string
    指的是控制曲线格式的字符串

    kwargs
    通过
    kwargs可以传入键值参数。

    1.2 不设置x时

    当不设置x时,x轴默认为0,1,2…这样的数值类型。

    import matplotlib.pyplot as plt
    plt.plot([1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.show()
    

          


    1.3 x中元素的顺序

    绘图时,绘图的顺序与x内数值本身的大小无关,数值在x中的顺序,即为绘图的先后顺序。
    如:

    import matplotlib.pyplot as plt
    plt.plot([2, 1, 3, 4, 5], [2, 5, 8, 12, 18])
    plt.show()
    

          
    即绘制此折线图时,先绘制了(2,2)点,再绘制了(1,5)点,接着绘制了(3, 8)点。


    在x中,只要存在一个数据是字符串类型,则x中所有的元素都视为字符串,这些元素在图像中不再有大小之分。

    代码示例如下:

    import matplotlib.pyplot as plt
    plt.plot([3, 1, '2', 4, 5], [2, 8, 12, 5, 9])
    plt.show()
    

            


    2.设置坐标轴范围 plt.xlim() & plt.ylim()

    plt.ylim() 设置y轴范围。

    plt.xlim() 设置x轴范围。

    import matplotlib.pyplot as plt
    plt.plot([1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.ylim(-3, 3)
    plt.xlim(-10, 20)
    plt.show()
    

           


    3.设置坐标标签 plt.xticks() & plt.yticks()

    设置标签,即可以将plot()中传入的x、y的元素值在坐标轴中以其他形式显示出来。
    具体方法为

    plt.xticks(location, lables,rotation)
    plt.yticks(location, lables,rotation)

    其中,location表示原x/y轴的数据(而不是位置索引下标),lables指新设定的标签,元素数量要与location相同,且与location相同位置上有着一一对应的关系。

    rotation参数通过设定一个角度的数值,可以将设定的标签旋转一定的角度。(示例代码中将x轴标签旋转45度)

    且在设置标签过程中,标签可以选择设置部分。没有设置的标签也不会再显示原值。(如下边代码中没有设置x轴上数值“2”处的标签)

    具体示例如下:

    import matplotlib.pyplot as plt
    # 正常显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.plot([1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.ylim(-3, 3)
    plt.xlim(-10, 20)
    plt.xticks([1, 3, 4, 5, 6, 7, 8, 9],
               ['02-01', '02-03', '02-04',
                '02-05', '02-06', '02-07', '02-08',
                '02-09'], rotation=45)
    plt.yticks([0, 1, -1], ['低', '高', '中'])
    plt.show()
    

            


    4.负号正常显示 与 中文正常显示 问题

    负号正常显示

    rcParams 是Matplotlib库中pyplot包绘图的参数字典,key为’axes.unicode_minus’的默认取值(value)为True,表示unicode的minus类型,有些字体对其兼容性支持不够,导致负号无法正常显示,现在将’axex.unicode_minus’的取值设为False,则可正常显示负号。

    代码:

    plt.rcParams[‘axes.unicode_minus’] = False


    中文正常显示

    默认情况下,图形中的中文为乱码形式

    每次绘图前,通过代码更改参数。更改Matplotlib包中pyplot包的参数字(rcParams)字体的无衬线字体属性(font.sans-serif, 为参数字典的一个key)的取值(value),现将其设定为以’SimHei’为元素的数组形式。

    代码:

    plt.rcParams[‘font.sans-serif’] = [‘SimHei’]


    5. 设置坐标 标签 plt.xlabel() & plt.ylabel()

    在图像中添加坐标轴标题可以直观地显示坐标轴代表的数据变量。

    plt.xlabel()

    plt.ylabel()

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.plot([1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.xticks([1, 2, 3, 4, 5, 6, 7, 8, 9],
               ['02-01', '02-02', '02-03', '02-04',
                '02-05', '02-06', '02-07', '02-08',
                '02-09'], rotation=45)
    plt.yticks([0, 1, -1], ['低', '高', '中'])
    plt.xlabel('日期')
    plt.ylabel('A指标')
    plt.show()
    

      


    6.增加标题 plt.title()

    plt.title()

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title('xxxxxxxxxxx图像')
    plt.plot([1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.xticks([1, 2, 3, 4, 5, 6, 7, 8, 9],
               ['02-01', '02-02', '02-03', '02-04',
                '02-05', '02-06', '02-07', '02-08',
                '02-09'], rotation=45)
    plt.yticks([0, 1, -1], ['低', '高', '中'])
    plt.xlabel('日期')
    plt.ylabel('A指标')
    plt.show()
    

           


    7.增加图例 和 网格 plt.legend() & plt.grid()

    增加图例可以通过plt.plot()方法的label参数添加,也可以通过plt.legend()添加。

    增加网格通过plt.grid()方法添加。

    plt.legend()
    第一个参数是一个可迭代对象,其元素为表示图例的字符串,其传入时的顺序与上边代码中线条绘制的顺序一一对应。
    第二个参数是loc参数,表示图例显示的位置。
    第三个参数为字体大小fontsize。

    plt.grid(b=None,which=‘major’, axis=‘both’, **kwargs)

    参数b:
    布尔数据类型,设定是否显示grid。默认为None,不显示。如需显示,则将B设定为True。

    参数which:
    设定 分割标示线(tick) 的类型,取值为"major", “minor"或者"both”。
    默认为"major",表示以原本坐标轴分割标示线为准;
    若取值为"minor",则表示 进一步细分 坐标轴分割标示线,但是 分割标准要提前设定好。如果只是设定值为"minor",则图形不会显示grid。
    “both"表示大小区间坐标轴分割线都有。

    参数axis:
    制定绘制grid的坐标轴,取值为"both”(default), “x”, 或者"y"。both表示X轴和Y轴的grid都绘制。 默认都绘制。

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.plot([5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31], label='股票A收盘价')
    plt.plot([5.09, 5.13, 5.16, 5.12, 5.09, 5.25, 5.16, 5.20, 5.25], label='股票B收盘价')
    plt.xticks(range(9), [
    	'2021-02-01', '2021-02-02', '2021-02-03', '2021-02-04',
    	'2021-02-05', '2021-02-06', '2021-02-07', '2021-02-08',
    	'2021-02-09'], rotation=45)
    plt.title('某股票收盘价时序图')
    plt.xlabel('日期')
    plt.ylabel('价格')
    plt.grid(True, axis='y')
    plt.legend()
    plt.show()
    


    8. 设置样式(颜色,线条,标记)

    8.1 线条颜色 color

    修改图形的颜色通过设定plot()的color参数来实现,color参数也可以简写为c。

    颜色的取值有多种方式指定,最常用的是直接设定颜色的名称或颜色名称的简写,也可以通过RGB数组(比如(1,1,0)等其他方式设定)。

    常用的颜色简写有

    颜色 简写 英文
    蓝色 b blue
    红色 r red
    绿色 g green
    黄色 y yellow
    黑色 k black
    白色 w white
    洋红色(也称品红色) m magenta
    蓝绿色(即青色) c cyan

    此外,常用颜色还可以选择的有brown,purple,pink,orange,olive,gold,gray等。


    8.2 线条样式 linestyle

    plot()函数中的linestyle参数用于设定曲线的类型。为了书写方便,有时会用ls代替linestyle, 该参数的主要取值如表所示:

    线条类型可能的取值有

    类型 名称取值 符号取值
    实线 ‘solid’ ‘-’
    虚线(也称双画线) ‘dashed’ ‘—’ (两个短杠)
    线点 ‘dashdot’ ‘-.’
    点线 ‘dotted’ ‘:’
    不画线 ‘None’ ‘’
    虚线(另一种) ‘:’

    8.3 标记样式 maker

    除了线条样式外,还可以设置数据点的形状。数据点形状通过plot()方法的maker参数来设定。maker参数取值有很多,如表所示:

    点的形状marker的部分值表

    形状含义 符号取值(marker)
    点标记 .
    像素标记 ,
    实心圆标记 o
    向下三角形标记 v
    向上三角形标记 ^
    向左三角形标记 <
    向右三角形标记 >
    实心正方形标记 s
    实心五角星标记 ‘p’
    竖六边形标记 ‘h’
    横六边形标记 ‘H’
    下花三角标记 1
    上花三角标记 2
    左花三角标记 3
    右花三角标记 4
    加号标记 ‘+’
    叉号标记 ‘x’
    钻石标记(大菱形标记) D
    小钻石标记(小菱形标记) d
    星号标记 ‘*’
    竖线标记 ‘|’

    8.4 线条宽度 linewidth

    线条的宽度通过参数linewidth来设定。参数linewidth也可以简写成lw。


    8.5 标记的样式

    参数mfc用于设置标记的颜色
    参数ms用于设置标记的大小
    参数mec用于设置标记的边框的颜色。

    __

    8.6 样式使用示例

    绘制两条折线为例

    一条为红色,线条样式为“点线”类型,标记为大菱形标记,线条宽度为2。
    另一条为绿色,线条样式为虚线类型(’:’),标记为横六边形标记,线条宽度为4。

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.plot([5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31], label='股票A收盘价', c='r', ls='-.', marker='D', lw=2)
    plt.plot([5.09, 5.13, 5.16, 5.12, 5.09, 5.25, 5.16, 5.20, 5.25], label='股票B收盘价', c='g', ls=':', marker='H', lw=4)
    plt.xticks(range(9), \
    	      ['2021-02-01', '2021-02-02', '2021-02-03', '2021-02-04', \
    	      '2021-02-05', '2021-02-06', '2021-02-07', '2021-02-08', \
    	       '2021-02-09'], rotation=45)
    plt.title('某股票开盘价&收盘价时序图')
    plt.xlabel('日期')
    plt.ylabel('价格')
    plt.grid(True)
    plt.legend()
    plt.show()
    

    图像展示如下:


    9.面向对象绘图

    9.1 面向对象绘图 – 创建画布对象

    设置画布,Matplotlib绘图的一大特色,即面向对象绘图

    使用Matplotlib面向对象绘图,绘图前我们要先创建一个Figure对象,即所谓的“画布”,Figure对象是一个空白区域。Figure对象可以通过pyplot包中的figure函数进行创建。

    fig = plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

    其中
    num  指图像的编号或名称,数字为编号,字符串为名称。通过此参数来指定、区分不同的Figure对象。
    figsize  指画布的宽和高,单位为英寸。(x, y)
    dpi  指画布的分辨率,即每英寸有多少个像素,默认为80。
    facecolor  指背景颜色。
    edgecolor  指边框颜色。
    frameon  指是否显示边框,默认为True,表示绘制边框。否则不绘制边框。

    import matplotlib.pyplot as plt
    fig = plt.figure(1, facecolor='r', figsize=(5, 3))
    plt.plot([1, 1, 0, 0, -1, 0, 1, 1, -1])
    plt.show()
    

               


    对于每个Figure对象,都可以包含一个或者多个个Axes对象,每个Axes对象即一个绘图区域,其拥有自己独立的坐标系统。

    不设置画布时则自动创建一个只有一个Axes对象的画布,且位置居中。

    创建好Figure和Axes后,绘图时直接对创建的Axes对象调用相关方法即可(如ax1.plot()),不必再使用类似plt.plot()这样的形式。此即面向对象绘图。


    9.2 创建Axes对象

    以创建一个包含两个Axes的Figure对象为例,创建的方法有两种,一种是调用Figure对象的add_axes()方法,另一则是调用matplotlib的subplot()方法。


    add_axes()方法

    使用add_axes()方法创建Axes时,以对Figure对象fig创建Axes对象ax1为例,其语法如下

    ax1 = fig.add_axes([x1,y1,x2,y2])

    需要传入一个有四个元素的列表,四个数字依次表示创建的Axes的左下角、右上角的相对坐标位置。(原点在Figure对象左下角,计算相对位置时,Figure的宽和高都视为1个单位长度,要传入的坐标值都是0到1的浮点数)

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # 创建两个Axes对象
    ax1 = fig.add_axes([0.1, 0.1, 0.3, 0.3])
    ax2 = fig.add_axes([0.5, 0.5, 0.4, 0.4])
    plt.show()
    

           


    plt.subplot()方法

    使用plt.subplot()方法创建Axes时,其语法如下

    subplot(numRows, numCols, plotNum)

    其中
    num_Rows  指图像排多少行
    numCols  指图像排多少列
    plotNum  指图像的位置左上角第一个图像的位置开始记为1,往右依次记为2,3…,每一行的图像接着排下去,最终右下角的图像编号等于num_Rows×plotNum。
    代码示例如下:

    import matplotlib.pyplot as plt
    # 位置1
    ax1 = plt.subplot(221)
    ax1.set_title('ax1')
    # 位置2
    ax2 = plt.subplot(222)
    ax2.set_title('ax2')
    # 位置3
    ax3 = plt.subplot(223)
    ax3.set_title('ax3')
    # 位置4
    ax4 = plt.subplot(224)
    ax4.set_title('ax4')
    plt.show()
    


    9.3 常用面向对象绘图方法

    以Axes对象ax1为例,常用的面向对象绘图方法有:


    #绘图

    ax1.plot()


    #设置网格

    ax1.grid()


    #设置标题

    ax1.set_title(‘ax1_title’)


    #设置标签

    ax1.set_xlabel()


    ax1.set_ylabel()


    #设置坐标轴范围

    ax1.set_xlim()

    ax1.set_ylim()


    #设置刻度标签

    ax1.set_xticklabels()

    ax1.set_yticklabels()


    # 设置图例

    ax1.legend()


    # 显示图像
    将数据显示为图像,即在2D常规栅格上。

    ax1.imshow()


    # 显示图像
    将2D矩阵或数组的值绘制为颜色编码的图像。

    ax1.matshow()


    #添加一条水平线

    ax1.axhline()


    # 添加水平跨度

    ax1.axhspan


    # 添加一条垂直线

    ax1.axvline


    # 添加垂直跨度

    ax1.axvspan


    # 添加无限长的直线

    ax1.axline


    Axes对象也有bar(),barh(),pie(),scatter()等方法。


    10.matplotlib进阶学习

    更多相关操作,为了方便日常检索,小啾将其写在了其他博文中。且小啾将链接附在了文末,大家可以参考学习:



    matplotlib进阶传送门:


    (一)给图像添加 文本标签 与 注释

    (一)python-matplotlib给图像添加文本标签与注释


    (二)subplots_adjust()方法解决图表与画布的间距问题

    (二)python-matplotlib绘图 -应用subplots_adjust()解决图表与画布的间距问题


    (三)直方图的绘制

    (三)直方图的绘制 基于python-matplotlib库


    (四)单柱柱形图与多柱柱形图的绘制

    (四)单柱柱形图与多柱柱形图的绘制 基于python-matplotlib库


    (五)绘制饼形图专题(从一般饼状图到内嵌环形图)

    (五)python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)


    (六)绘制面积图&热力图

    (六)python-matplotlib 绘制面积图&热力图


    (七)绘制箱线图 与 异常值的输出

    (七)绘制箱线图 与 异常值的输出 – 基于Python matplotlib库


    (八)双y轴图像实现

    (八)python matplotlib 双y轴图像实现


    (九)绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)

    (九)python matplotlib绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)


    (十)绘制渐变色扇形图 -基于 颜色地图plt.cm模块儿

    (十)绘制渐变色扇形图 – 基于python – matplotlib 颜色地图plt.cm模块儿


    (十一)实现 等高线图

    (十一)实现 等高线图 – 基于python-matplotlib


    本次分享就到这里,小啾感谢您的关注与支持!
    🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

    来源:侯小啾

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python数据可视化三部曲之 Matplotlib 从上手到上头

    发表评论