• Python库学习(十):Matplotlib绘画库


    1. 介绍

    Matplotlib 是一个用于绘制图表和可视化数据的 Python 库。它提供了丰富的绘图工具,可以用于生成各种静态、交互式和动画图表。Matplotlib 是数据科学、机器学习和科学计算领域中最流行的绘图库之一。

    1.1 关键特性

    以下是 Matplotlib 的一些关键特性:

    • 简单易用: Matplotlib 提供了简单而直观的 API,使得用户能够轻松创建各种类型的图表。

    • 多种绘图类型: 支持绘制各种类型的图表,包括线图、散点图、柱状图、饼图、等高线图、3D 图表等。

    • 自定义性强: 用户可以轻松地自定义图表的外观和样式,包括颜色、线型、标签、标题等。

    • 支持 LaTex: 支持使用 LaTeX 渲染文本,使得图表标签和注释可以具有高质量的数学表达式。

    • 交互式图表: Matplotlib 可以嵌入到交互式环境中,如 Jupyter Notebook,支持交互式数据探索和动态更新。

    • 支持多种输出格式: 可以将图表保存为多种格式,如 PNG、PDF、SVG、EPS 等。

    • 对象导向: Matplotlib 的图表是通过对象导向的方式创建的,这意味着用户可以直接操作图表的元素,使得定制化和复杂的图表更加容易。

    • 内置样式和颜色映射: 提供了内置的样式表和颜色映射,使得用户可以轻松地应用一致的风格和颜色。

    • 复杂图表和子图: 支持创建复杂的图表布局和多子图,适用于需要展示多个数据视图的场景。

    • 跨平台: 可以在多个操作系统上运行,包括 Windows、Linux 和 macOS

    1.2 其他介绍

    Github(截止当前 18.2K):https://github.com/matplotlib/matplotlib

    2. 安装&升级

    2.1 安装

    # pip方式安装
    $ pip install matplotlib

    # conda方式安装
    $ conda install matplotlib
    • 1

    2.2 升级

    # pip方式升级
    $ pip install --upgrade matplotlib

    # conda方式升级
    $ conda update matplotlib
    • 1

    3. 绘图风格

    3.1 对象风格

    使用面向对象的风格画图,首先要创建画布(大容器),然后在画布中填充子图信息(小容器)

    import matplotlib.pyplot as plt
    import numpy as np

    if __name__ == '__main__':
        # 设置字体以便正确显示中文
        plt.rcParams['font.sans-serif'] = ['FangSong']
        # 正确显示连字符
        plt.rcParams['axes.unicode_minus'] = False
        # --------------- 创建画布 ---------------
        fig = plt.figure()
        # 设置画布大小
        fig.set_size_inches(75)
        # 设置画布颜色
        fig.set_facecolor('ivory')

        # --------------- 创建子图 ---------------
        # 设置子图位置
        subImg = fig.add_axes([0.10.10.80.8])
        # 设置x、y轴数据
        x = np.linspace(01020)
        y1 = np.power(x, 2)
        y2 = x * 10
        
        # 画线
        subImg.plot(x, y1, 'r', ls='-', linewidth=2, label='$x^2$')
        subImg.plot(x, y2, 'b', ls='--', linewidth=2, label='$x*10$')

        # 添加文本标志
        subImg.text(3.47.5r'$x^2$', fontsize=12)
        subImg.text(17.5r'$x*10$', fontsize=12)

        # 设置子图标题
        subImg.set_title("子图A标题", fontdict={'size'16})

        subImg.legend(loc='upper left')  # 生成图例
        # # 设置x、y轴标志
        subImg.set_xlabel('X轴', fontdict={'size'14})
        subImg.set_ylabel('Y轴', fontdict={'size'14})
        # 显示图片
        plt.show()
    • 1
    alt

    3.2 API风格

    除此上文风格,Matplotlib还提供一种类MATLAB风格的API,这种使用方式没有画布和子图的概念,直接调用函数即可绘图和显示。

    实现上面的图片效果代码如下:

    import matplotlib.pyplot as plt
    import numpy as np

    if __name__ == '__main__':
        # 设置字体以便正确显示中文
        plt.rcParams['font.sans-serif'] = ['FangSong']
        # 正确显示连字符
        plt.rcParams['axes.unicode_minus'] = False

        # 设置x、y轴数据
        x = np.linspace(01020)
        y1 = np.power(x, 2)
        y2 = x * 10

        # 画线
        plt.plot(x, y1, 'r', ls='-', linewidth=2, label='$x^2$')
        plt.plot(x, y2, 'b', ls='--', linewidth=2, label='$x*10$')

        # 添加文本标注
        plt.text(3.47.5r'$x^2$', fontsize=12)
        plt.text(17.5r'$x*10$', fontsize=12)
        # 设置子图标题
        plt.title("示例标题", fontdict={'size'16})
        # 生成图例
        plt.legend(loc='upper left')
        # 设置x、y轴标志
        plt.xlabel('X轴')
        plt.ylabel('Y轴')

        # 显示图片
        plt.show()
    • 1

    4. 快速绘图

    4.1 折线图

    • plt.plot() : 主要用于绘制折线图的主要函数之一。
    import matplotlib.pyplot as plt
    import numpy as np

    if __name__ == '__main__':
        # 设置字体以便正确显示中文
        plt.rcParams['font.sans-serif'] = ['FangSong']
        # 正确显示连字符
        plt.rcParams['axes.unicode_minus'] = False

        # 设置x、y轴数据
        x = np.linspace(01020)
        y1 = np.power(x, 2)
        y2 = x * 10

        # 图一位置,subplot(1, 2, 1) 代表画布是1行2列,当前图位于第1列
        plt.subplot(121)
        plt.title("图一")
        plt.plot(x, y1)

        # 图一位置,subplot(1, 2, 2) 代表画布是1行2列,当前图位于第2列
        plt.subplot(122)
        plt.title("图二")
        plt.plot(x, y2)
        # 显示图片
        plt.show()
    • 1
    alt

    4.2 曲线图

    严格来说,plot( )函数绘制的是折线图而非曲线图,因为该函数只是将顺序相邻的点以直线连接,如想画曲线图,推荐使用semilogx( )、semilogy( )和loglog( )等函数。

    import matplotlib.pyplot as plt
    import numpy as np

    # 设置字体以便正确显示中文
    plt.rcParams['font.sans-serif'] = ['FangSong']
    # 正确显示连字符
    plt.rcParams['axes.unicode_minus'] = False

    if __name__ == '__main__':
        # 生成示例数据
        x = np.linspace(110100)
        y = np.exp(x)

        # 创建画布和子图,1行3列
        fig, (ax1, ax2, ax3) = plt.subplots(13, figsize=(155))

        # 使用semilogx()在第一个子图中绘制对数x轴的折线图
        ax1.semilogx(x, y, label='对数x轴折线图')
        ax1.set_title('semilogx() 示例')
        ax1.set_xlabel('对数X轴')
        ax1.set_ylabel('Y轴')
        ax1.legend()

        # 使用semilogy()在第二个子图中绘制对数y轴的折线图
        ax2.semilogy(x, y, label='对数y轴折线图')
        ax2.set_title('semilogy() 示例')
        ax2.set_xlabel('X轴')
        ax2.set_ylabel('对数Y轴')
        ax2.legend()

        # 使用loglog()在第三个子图中绘制对数坐标轴的折线图
        ax3.loglog(x, y, label='对数坐标轴折线图')
        ax3.set_title('loglog() 示例')
        ax3.set_xlabel('对数X轴')
        ax3.set_ylabel('对数Y轴')
        ax3.legend()

        # 调整子图之间的距离
        plt.tight_layout()

        # 显示图表
        plt.show()
    • 1
    alt

    4.3 柱状图

    • plot.bar(): 用来绘制垂直柱状图
    • plot.barh(): 用来绘制水平柱状图
    import matplotlib.pyplot as plt

    # 设置字体以便正确显示中文
    plt.rcParams['font.sans-serif'] = ['FangSong']
    # 正确显示连字符
    plt.rcParams['axes.unicode_minus'] = False

    if __name__ == '__main__':
        # 生成示例数据
        names = ['孙悟空''猪八戒''唐僧''沙僧']
        values = [36247545]
        plt.title("年龄分布图")

        # 创建画布和子图
        fig, (ax1, ax2) = plt.subplots(12, figsize=(125))

        # 使用plot.bar()在第一个子图中绘制垂直条形图
        ax1.bar(names, values, color='blue')
        ax1.set_title('垂直条形图示例')
        ax1.set_xlabel('姓名')
        ax1.set_ylabel('年龄')

        # 使用plot.barh()在第二个子图中绘制水平条形图
        ax2.barh(names, values, color='green')
        ax2.set_title('水平条形图示例')
        ax2.set_xlabel('年龄')
        ax2.set_ylabel('姓名')

        # 调整子图之间的距离
        plt.tight_layout()

        # 显示图表
        plt.show()
    • 1
    alt

    4.4 散点图

    scatter() 函数用于绘制散点图,散点图是一种展示两个变量之间关系的常见图表类型。每个点的位置由两个变量的值决定,横轴表示一个变量,纵轴表示另一个变量。

    1. 参数说明
    scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
    • 1
    • x, y: 必需,表示散点图上点的横坐标和纵坐标。
    • s: 用于指定散点的大小。可以是一个标量,表示所有点的大小相同;也可以是一个数组,表示每个点的大小。
    • c: 用于指定散点的颜色。可以是一个标量,表示所有点的颜色相同;也可以是一个数组,表示每个点的颜色。此外,你还可以通过设置 c 参数为字符串值来表示使用预定义的颜色映射。
    • marker: 用于指定散点的标记样式,例如 'o' 表示圆点,'^' 表示三角形等。
    • cmap: 用于指定颜色映射,仅当 c 参数为数组时起作用。更多颜色参考文档: https://matplotlib.org/stable/users/explain/colors/colormaps.html
    • norm: 用于标准化颜色映射。
    • alpha: 用于指定散点的透明度,取值范围为 0(完全透明)到 1(完全不透明)。
    • linewidths: 用于指定散点边缘的线宽。
    • edgecolors: 用于指定散点边缘的颜色。
    2. 代码示例
    import matplotlib.pyplot as plt
    import numpy as np

    # 设置字体以便正确显示中文
    plt.rcParams['font.sans-serif'] = ['FangSong']
    # 正确显示连字符
    plt.rcParams['axes.unicode_minus'] = False

    if __name__ == '__main__':
        # 生成示例数据
        x = np.random.randn(50)
        y = np.random.randn(50)
        # 随机数,用于映射颜色
        color = 10 * np.random.rand(50)
        # 随机数表示点的面积
        area = np.square(30 * np.random.rand(50))
        plt.scatter(x, y, label="数据点", c=color, marker="o", s=area, cmap='flag', edgecolor='r')
        # 添加标题和标签
        plt.title("散点图示例")
        plt.xlabel("X轴")
        plt.ylabel("Y轴")
        # 显示图例
        plt.legend()
        # 显示图表
        plt.show()
    • 1
    alt

    4.5 饼图

    1. 参数说明
    pie(
            x, explode=None, labels=None, colors=None, autopct=None,
            pctdistance=0.6, shadow=False, labeldistance=1.1,
            startangle=0, radius=1, counterclock=True, wedgeprops=None,
            textprops=None, center=(00), frame=False,
            rotatelabels=False, *, normalize=True, hatch=None, data=None)
    • 1
    • x: 必需,表示每个部分的大小,可以是一个数组或一个标量。如果是一个数组,表示每个扇形的大小;如果是一个标量,表示所有扇形的大小相同。
    • explode: 用于指定哪些扇形被拉出。如果某个值大于0,表示对应索引的扇形会被拉出一定的距离。
    • labels: 扇形上显示的标签,可以是一个数组或 None。
    • colors: 扇形的颜色,可以是一个颜色列表,表示每个扇形的颜色;也可以是 None,表示使用默认颜色。
    • autopct: 控制在饼图上显示每个部分的百分比,可以是字符串格式化,例如 '%1.1f%%'。
    • pctdistance: 百分比标签与圆心的距离,取值范围为 [0, 1]。
    • shadow: 是否在饼图下方添加阴影。
    • labeldistance: 标签与圆心的距离,取值范围为 [0, 1]。
    • startangle: 饼图起始角度,按逆时针方向计算,0 度表示从正 x 轴开始。
    • radius: 饼图的半径。
    • counterclock: 是否按逆时针方向绘制饼图。
    • wedgeprops: 扇形的属性字典,用于设置扇形的样式,例如边界颜色、边界宽度等。
    • textprops: 标签的属性字典,用于设置标签的样式,例如字体大小、颜色等。
    • center: 饼图的中心坐标。
    • frame: 是否绘制一个带有刻度标签的坐标轴框架。
    • rotatelabels: 是否旋转标签。
    • normalize: 如果为 True,则将 x 归一化为百分比。
    2.代码示例
    import matplotlib.pyplot as plt

    # 设置字体以便正确显示中文
    plt.rcParams["font.sans-serif"] = ["FangSong"]
    # 正确显示连字符
    plt.rcParams["axes.unicode_minus"] = False

    if __name__ == '__main__':
        # 示例数据
        labels = ['Go''PHP''C''Java''Python']
        sizes = [15519.52040.5]
        # 哪个闪现
        explode = (00.1000)
        # 使用pie()绘制饼状图
        plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, explode=explode,
                colors=['gold''lightskyblue''lightcoral''lightgreen''purple'])

        # 添加标题
        plt.title('后端编程语言占比')

        # 显示图表
        plt.show()
    • 1
    alt

    4.6 等值线图

    import matplotlib.pyplot as plt
    import numpy as np

    # 设置字体以便正确显示中文
    plt.rcParams["font.sans-serif"] = ["FangSong"]
    # 正确显示连字符
    plt.rcParams["axes.unicode_minus"] = False

    if __name__ == '__main__':
        # 创建示例数据
        x = np.linspace(-55100)
        y = np.linspace(-55100)
        X, Y = np.meshgrid(x, y)
        Z = np.sin(np.sqrt(X ** 2 + Y ** 2))

        # 创建画布和子图
        fig, (ax1, ax2) = plt.subplots(12, figsize=(125))

        # ------------------------------ 图A-contour-填充示例 ----------------------------------
        contour_plot = ax1.contour(X, Y, Z, levels=20, cmap='viridis')
        fig.colorbar(contour_plot, label='Z值')
        ax1.set_title('等值线图示例')
        ax1.set_xlabel('X轴')
        ax1.set_ylabel('Y轴')

        # ------------------------------ 图B-contourf-填充示例 ----------------------------------
        contour_plot = ax2.contourf(X, Y, Z, levels=20, cmap='viridis')
        fig.colorbar(contour_plot, label='Z值')
        ax2.set_title('等值线图(填充)')
        ax2.set_xlabel('X轴')
        ax2.set_ylabel('Y轴')

        # 显示图表
        plt.show()
    • 1
    alt

    4.7 矢量合成图

    矢量合成图以箭头的形式绘制矢量,因此也被称为箭头图。矢量合成图以箭头的方向表示矢量的方向。

    import matplotlib.pyplot as plt
    import numpy as np

    # 设置字体以便正确显示中文
    plt.rcParams["font.sans-serif"] = ["FangSong"]
    # 正确显示连字符
    plt.rcParams["axes.unicode_minus"] = False

    if __name__ == '__main__':
        # 创建两个矢量
        vector1 = np.array([32])
        vector2 = np.array([-14])

        # 计算矢量合成结果
        resultant_vector = vector1 + vector2

        # 创建图表和子图
        fig, ax = plt.subplots()

        # 绘制矢量1
        ax.arrow(00, vector1[0], vector1[1], head_width=0.2, head_length=0.2, fc='blue', ec='blue', label='矢量1')

        # 绘制矢量2
        ax.arrow(00, vector2[0], vector2[1], head_width=0.2, head_length=0.2, fc='red', ec='red', label='矢量2')

        # 绘制矢量合成结果
        ax.arrow(00, resultant_vector[0], resultant_vector[1], head_width=0.2, head_length=0.2, fc='green', ec='green',
                 label='结果')

        # 设置坐标轴
        ax.set_xlim(-25)
        ax.set_ylim(-18)

        # 添加网格
        ax.grid(True)
        # 添加标签和标题
        ax.set_xlabel('X轴')
        ax.set_ylabel('Y轴')
        ax.set_title('矢量图示例')

        # 添加图例
        ax.legend()

        # 显示图表
        plt.show()
    • 1
    alt

    本文由 mdnice 多平台发布

  • 相关阅读:
    图文并茂——队列的实现 ,C语言实现
    Docker 存储卷
    Java入门必备知识你能掌握多少?
    电商领域的三大沉疴难题?实在智能RPA来帮你药到病除!
    Java-使用Map集合计算文本中字符的个数
    遗传算法的改进——跳出局部最优机制的研究(选择算子、交叉算子、变异算子的改进)
    MFC Windows 程序设计[149]之上报控件组全展示
    新手开抖店之前,这三个核心点,一定要提前了解!
    个人网站广告联盟平台比较(获取被动收入) Mediavine,Adsense,ezoic使用评测比较
    Shader Graph25-UV移动旋转缩放(自定义函数)
  • 原文地址:https://blog.csdn.net/weixin_39001207/article/details/133873083