首页
学习
活动
专区
圈层
工具
发布

Matplotlib子图

Matplotlib子图详解

基础概念

Matplotlib子图(Subplot)是指在同一个图形窗口(figure)中创建多个坐标轴(axes)对象,用于在同一画布上展示多个相关图表。这是数据可视化中常用的技术,可以方便地比较不同数据集或同一数据集的不同方面。

子图类型

Matplotlib提供了几种创建子图的方式:

  1. plt.subplot() - 基于网格创建子图
  2. plt.subplots() - 一次性创建多个子图
  3. GridSpec - 更灵活的子图布局
  4. subplot2grid() - 创建不规则布局的子图

优势

  • 节省空间,可以在一个窗口中展示多个相关图表
  • 便于数据对比和分析
  • 保持一致的风格和比例
  • 减少重复代码

应用场景

  • 多维度数据可视化
  • 算法效果对比
  • 时间序列分析
  • 特征相关性分析
  • 模型训练过程监控

常见问题及解决方案

1. 子图重叠

原因:通常是由于子图间距设置不当或画布大小不足导致。

解决方案

代码语言:txt
复制
import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 2)
plt.tight_layout()  # 自动调整子图间距
plt.show()

或者手动调整:

代码语言:txt
复制
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.4, hspace=0.4)

2. 子图大小不一致

原因:默认情况下,Matplotlib会尝试保持子图大小一致,但某些情况下可能失效。

解决方案

代码语言:txt
复制
fig, axs = plt.subplots(2, 2, figsize=(10, 8), gridspec_kw={'width_ratios': [3, 1], 'height_ratios': [1, 2]})

3. 共享坐标轴

原因:需要比较相同量纲的数据时,共享坐标轴更方便。

解决方案

代码语言:txt
复制
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)

4. 不规则子图布局

解决方案

代码语言:txt
复制
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])  # 第一行全部
ax2 = plt.subplot(gs[1, :-1])  # 第二行前两列
ax3 = plt.subplot(gs[1:, -1])  # 第二三行最后一列
ax4 = plt.subplot(gs[-1, 0])  # 最后一行第一列
ax5 = plt.subplot(gs[-1, -2])  # 最后一行倒数第二列

完整示例代码

代码语言:txt
复制
import numpy as np
import matplotlib.pyplot as plt

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(-x)

# 创建2x2的子图
fig, axs = plt.subplots(2, 2, figsize=(10, 8))

# 绘制第一个子图
axs[0, 0].plot(x, y1, 'r-')
axs[0, 0].set_title('Sin(x)')
axs[0, 0].grid(True)

# 绘制第二个子图
axs[0, 1].plot(x, y2, 'b--')
axs[0, 1].set_title('Cos(x)')
axs[0, 1].grid(True)

# 绘制第三个子图
axs[1, 0].plot(x, y3, 'g-.')
axs[1, 0].set_title('Tan(x)')
axs[1, 0].set_ylim(-5, 5)  # 限制y轴范围
axs[1, 0].grid(True)

# 绘制第四个子图
axs[1, 1].plot(x, y4, 'm:')
axs[1, 1].set_title('Exp(-x)')
axs[1, 1].grid(True)

# 添加大标题
fig.suptitle('Trigonometric and Exponential Functions', fontsize=16)

# 调整布局
plt.tight_layout()
plt.show()

高级技巧

  1. 嵌套子图
代码语言:txt
复制
fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=3)
ax3 = plt.subplot2grid((3, 3), (1, 0))
ax4 = plt.subplot2grid((3, 3), (1, 1))
ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=2)
  1. 共享x轴
代码语言:txt
复制
fig, axs = plt.subplots(3, 1, sharex=True)
  1. 不同比例的子图
代码语言:txt
复制
fig = plt.figure(figsize=(10, 6))
gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[1, 2])

Matplotlib子图功能强大且灵活,掌握这些技巧可以显著提高数据可视化的效率和质量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券