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

2.2 升级

复制代码
# pip方式升级
$ pip install --upgrade matplotlib

# conda方式升级
$ conda update matplotlib

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(7, 5)
    # 设置画布颜色
    fig.set_facecolor('ivory')

    # --------------- 创建子图 ---------------
    # 设置子图位置
    subImg = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    # 设置x、y轴数据
    x = np.linspace(0, 10, 20)
    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.4, 7.5, r'$x^2$', fontsize=12)
    subImg.text(1, 7.5, r'$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()

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(0, 10, 20)
    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.4, 7.5, r'$x^2$', fontsize=12)
    plt.text(1, 7.5, r'$x*10$', fontsize=12)
    # 设置子图标题
    plt.title("示例标题", fontdict={'size': 16})
    # 生成图例
    plt.legend(loc='upper left')
    # 设置x、y轴标志
    plt.xlabel('X轴')
    plt.ylabel('Y轴')

    # 显示图片
    plt.show()

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(0, 10, 20)
      y1 = np.power(x, 2)
      y2 = x * 10
    
      # 图一位置,subplot(1, 2, 1) 代表画布是1行2列,当前图位于第1列
      plt.subplot(1, 2, 1)
      plt.title("图一")
      plt.plot(x, y1)
    
      # 图一位置,subplot(1, 2, 2) 代表画布是1行2列,当前图位于第2列
      plt.subplot(1, 2, 2)
      plt.title("图二")
      plt.plot(x, y2)
      # 显示图片
      plt.show()

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(1, 10, 100)
    y = np.exp(x)

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

    # 使用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()

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 = [36, 24, 75, 45]
    plt.title("年龄分布图")

    复制代码
      # 创建画布和子图
      fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
    
      # 使用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()

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)
  • 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()

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=(0, 0), frame=False,
        rotatelabels=False, *, normalize=True, hatch=None, data=None)
  • 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 = [15, 5, 19.5, 20, 40.5]
    # 哪个闪现
    explode = (0, 0.1, 0, 0, 0)
    # 使用pie()绘制饼状图
    plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, explode=explode,
            colors=['gold', 'lightskyblue', 'lightcoral', 'lightgreen', 'purple'])

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

    # 显示图表
    plt.show()

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(-5, 5, 100)
    y = np.linspace(-5, 5, 100)
    X, Y = np.meshgrid(x, y)
    Z = np.sin(np.sqrt(X ** 2 + Y ** 2))

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

    # ------------------------------ 图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()

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([3, 2])
    vector2 = np.array([-1, 4])

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

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

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

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

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

    # 设置坐标轴
    ax.set_xlim(-2, 5)
    ax.set_ylim(-1, 8)

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

    # 添加图例
    ax.legend()

    # 显示图表
    plt.show()

本文由mdnice多平台发布

相关推荐
cr7xin7 分钟前
缓存三大问题及解决方案
redis·后端·缓存
间彧1 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧1 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧1 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧1 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧1 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧1 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧2 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang2 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
草明3 小时前
Go 的 IO 多路复用
开发语言·后端·golang