• 【Python数据科学快速入门系列 | 07】Matplotlib数据可视化基础入门(二)


    这是机器未来的第53篇文章

    原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126752099

    《Python数据科学快速入门系列》快速导航:



    写在开始:

    • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
    • 博主社区:AIoT机器智能, 欢迎加入!
    • 专栏简介:从0到1掌握数据科学常用库Numpy、Matploblib、Pandas。
    • 面向人群:AI初级学习者

    接上一篇文章:【Python数据科学快速入门系列 | 06】Matplotlib数据可视化基础入门(一)

    前言

    本文概述了matplotlib是什么,能做什么,怎么做的问题,是一篇matplotlib数据可视化入门文章,对于matplotlib的基础功能做了一个整体的使用说明。包含图例、轴标签、绘图区域的标签、轴的刻度、轴的范围,cmap颜色图谱映射以及注释等内容。

    3. Matplotlib的基础使用

    3.2.5 添加图例标签

    在同一个绘图区域内存在多个图表时,容易混淆看不清每个图标具体标识什么类型的数据,可以设置图例来标识来区分。

    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成0~2π之间的等差数列,数据元素为30个
    x = np.linspace(0, 2*np.pi, 30)
    y1 = np.cos(x)
    y2 = np.sin(x)
    y3 = np.cos(2*x)
    
    fig, ax = plt.subplots()
    
    # g-green,o-cycle圆点标记,--为杠杠虚线,其它样式需要单独指定
    ax.plot(x, y1, 'go--', linewidth=2, markersize=6, label="cos(x)")
    # c-青色,^-三角标志,:为点虚线
    ax.plot(x, y2, 'c^:', linewidth=2, markersize=3, label="sin(x)")
    # b-blue,*-star标志,-.为杠点虚线
    ax.plot(x, y3, 'b*-.', linewidth=2, markersize=3, label="cos(2x)")
    
    # 默认在左下角,可以通过loc指定图例放置的位置。
    ax.legend(loc='upper right')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    
    
    • 1

    png

    可以看到在右上角新增了图例区域,指定了曲线的数据函数名称。

    可支持的位置配置如下:

    Location StringLocation Code
    ‘best’0
    ‘upper right’1
    ‘upper left’2
    ‘lower left’3
    ‘lower right’4
    ‘right’5
    ‘center left’6
    ‘center right’7
    ‘lower center’8
    ‘upper center’9
    ‘center’10

    3.2.6 设置轴的标签和图的标题

    ax.set_xlable - 设置X轴标签
    ax.set_ylabel - 设置Y轴标签
    ax.set_title  - 设置绘图区域的标题,如果要支持中文,需要做如下配置:
    
    • 1
    • 2
    • 3
    plt.rcParams["font.sans-serif"]=["SimHei"] 
    
    • 1
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    
    # from cProfile import label
    # windows配置SimHei,Ubuntu配置WenQuanYi Micro Hei
    plt.rcParams["font.sans-serif"]=["WenQuanYi Micro Hei"] #设置字体
    plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
    
    # 生成0~2π之间的等差数列,数据元素为30个
    x = np.linspace(0, 2*np.pi, 30)
    y1 = np.cos(x)
    y2 = np.sin(x)
    y3 = np.cos(2*x)
    y4 = np.sin(2*x)
    
    fig, ax = plt.subplots()
    
    # g-green,o-cycle圆点标记,--为杠杠虚线,其它样式需要单独指定
    ax.plot(x, y1, 'go--', linewidth=2, markersize=6, label="cos(x)")
    # c-青色,^-三角标志,:为点虚线
    ax.plot(x, y2, 'c^:', linewidth=2, markersize=3, label="sin(x)")
    # b-blue,*-star标志,-.为杠点虚线
    ax.plot(x, y3, 'b*-.', linewidth=2, markersize=3, label="cos(2x)")
    
    # 设置X轴标签
    ax.set_xlabel("Angel")
    # 设置Y轴标签
    ax.set_ylabel("Value")
    # 设置标题,如果要支持中文,需要plt.rcParams["font.sans-serif"]设置为SimHei黑体
    ax.set_title("函数示例")
    # 默认在左下角,可以通过loc指定图例放置的位置。
    ax.legend(loc='best')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    
    
    • 1

    png

    3.2.7 设置轴的刻度值

    # ticks指定自定义的浮点类型的刻度标签列表
    # labels指定自定义的字符串格式的刻度标签列表,与ticks刻度值相对应,可选
    # mininor默认值为False,开启后,默认刻度标签和自定义刻度标签都会启用
    ax.set_xticks(ticks, labels, minior=False)
    ax.set_yticks(ticks, labels, minior=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    
    # from cProfile import label
    # windows配置SimHei,Ubuntu配置WenQuanYi Micro Hei
    plt.rcParams["font.sans-serif"]=["WenQuanYi Micro Hei"] #设置字体
    plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
    
    # 生成0~2π之间的等差数列,数据元素为30个
    x = np.linspace(0, 2*np.pi, 30)
    y1 = np.cos(x)
    y2 = np.sin(x)
    y3 = np.cos(2*x)
    y4 = np.sin(2*x)
    
    fig, ax = plt.subplots()
    
    # g-green,o-cycle圆点标记,--为杠杠虚线,其它样式需要单独指定
    ax.plot(x, y1, 'go--', linewidth=2, markersize=6, label="cos(x)")
    # c-青色,^-三角标志,:为点虚线
    ax.plot(x, y2, 'c^:', linewidth=2, markersize=3, label="sin(x)")
    # b-blue,*-star标志,-.为杠点虚线
    ax.plot(x, y3, 'b*-.', linewidth=2, markersize=3, label="cos(2x)")
    
    # 设置X轴标签
    ax.set_xlabel("Angel")
    # 设置Y轴标签
    ax.set_ylabel("Value")
    # 设置标题,如果要支持中文,需要plt.rcParams["font.sans-serif"]设置为SimHei黑体
    ax.set_title("函数示例")
    # 默认在左下角,可以通过loc指定图例放置的位置。
    ax.legend(loc='best')
    
    # 修改X轴刻度标签
    # np.arange(start, end, step)生成0,2π之间的步长为π/4的列表
    # labels根据ticks刻度值重新定义标签名称
    ax.set_xticks(ticks=np.arange(0, 2*np.pi, np.pi/4), labels=[0, 'π/4', 'π/2', '3π/4', 'π', '5π/4', '3π/2', '2π'])
    # 直接指定ticks即可
    ax.set_yticks(ticks=[-1.0, -0.5, 0, 0.5, 1])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40


    png

    3.2.8 设置坐标轴的范围

    3.2.8.1 set_xlim和set_ylim
    ax.set_ylim(bottom, top)
    ax.set_xlim(left, right)
    
    • 1
    • 2
    3.2.8.2 ax.set方法
    ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
    
    • 1
    3.2.8.3 ax.axis方法
    ax.axis(xmin, xmax, ymin, ymax)
    # 或
    plt.axis(xmin, xmax, ymin, ymax)
    
    • 1
    • 2
    • 3
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    
    # from cProfile import label
    # windows配置SimHei,Ubuntu配置WenQuanYi Micro Hei
    plt.rcParams["font.sans-serif"]=["WenQuanYi Micro Hei"] #设置字体
    plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
    
    # 生成0~2π之间的等差数列,数据元素为30个
    x = np.linspace(0, 2*np.pi, 30)
    y1 = np.cos(x)
    y2 = np.sin(x)
    y3 = np.cos(2*x)
    y4 = np.sin(2*x)
    
    fig, ax = plt.subplots()
    
    # g-green,o-cycle圆点标记,--为杠杠虚线,其它样式需要单独指定
    ax.plot(x, y1, 'go--', linewidth=2, markersize=6, label="cos(x)")
    # c-青色,^-三角标志,:为点虚线
    ax.plot(x, y2, 'c^:', linewidth=2, markersize=3, label="sin(x)")
    # b-blue,*-star标志,-.为杠点虚线
    ax.plot(x, y3, 'b*-.', linewidth=2, markersize=3, label="cos(2x)")
    
    # 设置X轴标签
    ax.set_xlabel("Angel")
    # 设置Y轴标签
    ax.set_ylabel("Value")
    # 设置标题,如果要支持中文,需要plt.rcParams["font.sans-serif"]设置为SimHei黑体
    ax.set_title("函数示例")
    # 默认在左下角,可以通过loc指定图例放置的位置。
    ax.legend(loc='best')
    
    # 修改X轴刻度标签
    # np.arange(start, end, step)生成0,2π之间的步长为π/4的列表
    # labels根据ticks刻度值重新定义标签名称
    ax.set_xticks(ticks=np.arange(0, 2*np.pi, np.pi/4), labels=[0, 'π/4', 'π/2', '3π/4', 'π', '5π/4', '3π/2', '2π'])
    # 直接指定ticks即可
    ax.set_yticks(ticks=[-1.0, -0.5, 0, 0.5, 1])
    
    # 设置限制
    ax.set(xlim=(np.pi/4, np.pi*2), ylim=(-1.5, 1.5))
    # ax.set_xlim(np.pi/4, np.pi*2)
    # ax.set_ylim(-1.5, 1.5)
    # ax.axis([np.pi/4, np.pi*2, -1.5, 1.5])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    (0.7853981633974483, 6.283185307179586, -1.5, 1.5)
    
    • 1


    png

    3.2.9 颜色图谱映射

    2D平面图表一般数据输入是2个维度,X,Y,有时候我们需要体现3个维度,这个时候我们会将第3个维度体现在颜色上。

    例如,我们现在需要做鸢尾花数据集中花萼长度和花萼宽度与鸢尾花分类的相关性分析,现在数据其实就有3个维度,花萼长度、花萼宽度、鸢尾花分类。而我们的2D图表又仅能表示2维的关系。

    有个办法就是将鸢尾花分类这个维度体现在颜色上,默认情况下,颜色我们仅配置一个颜色代码,如果鸢尾花的分类具有多个分类,那么应该用不同的颜色来标识,这个时候就需要用到颜色图谱映射功能cmap。

    以鸢尾花数据集中花萼长度和花萼宽度与鸢尾花分类的相关性分析为例。

    import numpy as np
    
    data = []
    column_name = []
    with open(file='iris.txt',mode='r') as f:
        # 过滤标题行
        line = f.readline()
        if line:
            column_name = np.array(line.strip().split(','))
            
        while True:
            line = f.readline()
            if line:
                data.append(line.strip().split(','))
            else:
                break
    
    data = np.array(data,dtype=float)
    
    # 使用切片提取前4列数据作为特征数据
    X_data = data[:, :4]  # 或者 X_data = data[:, :-1]
    
    # 使用切片提取最后1列数据作为标签数据
    y_data = data[:, -1]
    
    print(data.shape, X_data.shape, y_data.shape)
    # X_data[:,0],X_data[:,1],y_data分别为花萼长度,花萼宽度,鸢尾花分类
    # cmap是颜色代码映射表
    plt.scatter(X_data[:,0], X_data[:,1], c=y_data, cmap='brg_r', s=10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    (150, 5) (150, 4) (150,)
    
    
    
    • 1
    • 2
    • 3

    png

    这样就非常直观地将2种特征和标签的相关性体现出来了。

    cmap支持的颜色图谱非常多,有以下两种方式获得颜色图谱代码:

    • 从官网查询可视化的颜色代码

    https://matplotlib.org/stable/gallery/color/colormap_reference.html

    • 根据代码获取
    # 获取颜色图谱方式2
    
    import matplotlib as mpl
    print(mpl.colormaps)
    
    • 1
    • 2
    • 3
    • 4
    ColormapRegistry; available colormaps:
    'magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', 'pink', 'prism', 'rainbow', 'seismic', 'spring', 'summer', 'terrain', 'winter', 'Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c', 'magma_r', 'inferno_r', 'plasma_r', 'viridis_r', 'cividis_r', 'twilight_r', 'twilight_shifted_r', 'turbo_r', 'Blues_r', 'BrBG_r', 'BuGn_r', 'BuPu_r', 'CMRmap_r', 'GnBu_r', 'Greens_r', 'Greys_r', 'OrRd_r', 'Oranges_r', 'PRGn_r', 'PiYG_r', 'PuBu_r', 'PuBuGn_r', 'PuOr_r', 'PuRd_r', 'Purples_r', 'RdBu_r', 'RdGy_r', 'RdPu_r', 'RdYlBu_r', 'RdYlGn_r', 'Reds_r', 'Spectral_r', 'Wistia_r', 'YlGn_r', 'YlGnBu_r', 'YlOrBr_r', 'YlOrRd_r', 'afmhot_r', 'autumn_r', 'binary_r', 'bone_r', 'brg_r', 'bwr_r', 'cool_r', 'coolwarm_r', 'copper_r', 'cubehelix_r', 'flag_r', 'gist_earth_r', 'gist_gray_r', 'gist_heat_r', 'gist_ncar_r', 'gist_rainbow_r', 'gist_stern_r', 'gist_yarg_r', 'gnuplot_r', 'gnuplot2_r', 'gray_r', 'hot_r', 'hsv_r', 'jet_r', 'nipy_spectral_r', 'ocean_r', 'pink_r', 'prism_r', 'rainbow_r', 'seismic_r', 'spring_r', 'summer_r', 'terrain_r', 'winter_r', 'Accent_r', 'Dark2_r', 'Paired_r', 'Pastel1_r', 'Pastel2_r', 'Set1_r', 'Set2_r', 'Set3_r', 'tab10_r', 'tab20_r', 'tab20b_r', 'tab20c_r'
    
    • 1
    • 2

    3.2.10 添加注释

    3.2.10.1 文本注释

    可以在绘图区域的任意指定坐标显示注释, 注释支持Latex公式

    # x,y 坐标
    # s   注释
    ax.text(x, y, s, fontdict=None, **kwargs)
    
    • 1
    • 2
    • 3
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    
    # from cProfile import label
    # windows配置SimHei,Ubuntu配置WenQuanYi Micro Hei
    plt.rcParams["font.sans-serif"]=["WenQuanYi Micro Hei"] #设置字体
    plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
    
    fig, ax = plt.subplots()
    
    # g-green,o-cycle圆点标记,--为杠杠虚线,其它样式需要单独指定
    ax.plot(x, y1, 'go--', linewidth=2, markersize=6, label="cos(x)")
    # c-青色,^-三角标志,:为点虚线
    ax.plot(x, y2, 'c^:', linewidth=2, markersize=3, label="sin(x)")
    # b-blue,*-star标志,-.为杠点虚线
    ax.plot(x, y3, 'b*-.', linewidth=2, markersize=3, label="cos(2x)")
    
    # 设置X轴标签
    ax.set_xlabel("Angel")
    # 设置Y轴标签
    ax.set_ylabel("Value")
    # 设置标题,如果要支持中文,需要plt.rcParams["font.sans-serif"]设置为SimHei黑体
    ax.set_title("函数示例")
    # 默认在左下角,可以通过loc指定图例放置的位置。
    ax.legend(loc='best')
    
    # 在坐标(2, 0.95)添加注释sin(x)
    ax.text(2, 0.95, "sin(x)")
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31


    png

    3.2.10.2 箭头文本注释
    # xy, 箭头坐标
    # xytext,文本坐标
    # arrowprops,箭头样式
    ax.annotate('local max', xy=(2.5, 1), xytext=(3, 1.5),
                arrowprops=dict(facecolor='black', shrink=0.05))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    fig, ax = plt.subplots()
    
    t = np.arange(0.0, 5.0, 0.01)
    s = np.cos(2 * np.pi * t)
    line, = ax.plot(t, s, lw=2)
    
    ax.annotate('local max', xy=(2.0, 1), xytext=(3, 1.5),
                arrowprops=dict(facecolor='black', shrink=0.05))
    
    ax.set_ylim(-2, 2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    (-2.0, 2.0)
    
    • 1


    png

    4. 总结

    本文总结了matplotlib基础的语法及用法,包含了安装、图的绘制、绘图样式,X、Y轴标签、图的标题、图例、注释等描述,更多高级功能详情访问matplotlib.org。

    扩展思考:

    matplotlib的适用边界在哪里?在哪些场景不适合用matplotlib,你知道吗?请在评论区写出你的答案。

    参考文献

    — 博主热门专栏推荐 —

  • 相关阅读:
    形式化验证笔记
    Intel oneAPI笔记(3)--jupyter官方文档(SYCL Program Structure)学习笔记
    设计循环队列,解决假溢出问题
    Linux离线安装Mysql-5.7
    杭电oj--C语言合法标识符判定
    Linux---使用nice、cpulimit 和 cgroups管理系统资源
    Node.js学习19~37(模块化)
    SaaS CRM系统的优势,与本地部署相比哪个更方便?
    基于SSM的OA办公系统
    Matlab论文插图绘制模板第47期—词云图(Wordcloud)
  • 原文地址:https://blog.csdn.net/RobotFutures/article/details/126900121