Matplotlib子图(Subplot)是指在同一个图形窗口(figure)中创建多个坐标轴(axes)对象,用于在同一画布上展示多个相关图表。这是数据可视化中常用的技术,可以方便地比较不同数据集或同一数据集的不同方面。
Matplotlib提供了几种创建子图的方式:
plt.subplot()
- 基于网格创建子图plt.subplots()
- 一次性创建多个子图GridSpec
- 更灵活的子图布局subplot2grid()
- 创建不规则布局的子图原因:通常是由于子图间距设置不当或画布大小不足导致。
解决方案:
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2)
plt.tight_layout() # 自动调整子图间距
plt.show()
或者手动调整:
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.4, hspace=0.4)
原因:默认情况下,Matplotlib会尝试保持子图大小一致,但某些情况下可能失效。
解决方案:
fig, axs = plt.subplots(2, 2, figsize=(10, 8), gridspec_kw={'width_ratios': [3, 1], 'height_ratios': [1, 2]})
原因:需要比较相同量纲的数据时,共享坐标轴更方便。
解决方案:
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)
解决方案:
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]) # 最后一行倒数第二列
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()
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)
fig, axs = plt.subplots(3, 1, sharex=True)
fig = plt.figure(figsize=(10, 6))
gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[1, 2])
Matplotlib子图功能强大且灵活,掌握这些技巧可以显著提高数据可视化的效率和质量。
没有搜到相关的文章