You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib创建包含6组垂直子图的2×3布局绘图

如何使用Matplotlib创建包含6组垂直子图的2×3布局绘图

当然可以实现!你想要的是嵌套子图布局——在一个2×3的大网格中,每个单元格内部再包含2个垂直堆叠的子图。Matplotlib的GridSpec工具(或者更直观的subplot_mosaic)能完美满足这个需求,下面我会结合你的示例代码,给出两种可行的实现方案。


方法一:使用嵌套GridSpec(灵活可控)

这种方法通过外层GridSpec定义2×3的大布局框架,每个大单元格内部再用内层GridSpec创建2×1的垂直子布局,完全匹配你的需求逻辑。

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec
import numpy as np

# 生成通用的X轴数据
x = np.linspace(0, 10, 100)

# 创建画布
fig = plt.figure(figsize=(16, 8))

# 定义外层GridSpec:2行3列的大布局,设置单元格间距
outer_grid = GridSpec(2, 3, wspace=0.3, hspace=0.4)

# 遍历每个大单元格(2行×3列)
for row in range(2):
    for col in range(3):
        # 为当前大单元格创建内层GridSpec:2行1列的垂直子布局
        inner_grid = GridSpecFromSubplotSpec(2, 1, subplot_spec=outer_grid[row, col], hspace=0.2)
        
        # 初始化内层的上下两个子图
        ax_top = fig.add_subplot(inner_grid[0])
        ax_bottom = fig.add_subplot(inner_grid[1])
        
        # 为每个组生成差异化的曲线(方便区分,实际可替换为你的真实数据)
        phase_offset = row * 3 + col * 0.5
        y1 = np.sin(x + phase_offset)
        y2 = np.cos(x + phase_offset)
        
        # 绘制顶部子图(和你原代码逻辑完全对齐)
        ax_top.plot(x, y1, label=f"sin(x + {phase_offset:.1f})", color="blue")
        ax_top.set_ylabel("Top Y-Axis")
        ax_top.set_title(f"Group ({row+1}, {col+1})")
        ax_top.legend()
        
        # 绘制底部子图
        ax_bottom.plot(x, y2, label=f"cos(x + {phase_offset:.1f})", color="orange")
        ax_bottom.set_ylabel("Bottom Y-Axis")
        ax_bottom.set_xlabel("Shared X-Axis")
        ax_bottom.legend()

# 自动调整整体布局
plt.tight_layout()
plt.show()

关键说明:

  • outer_grid 负责控制整个画布的2×3大框架,wspace/hspace参数用来调整大单元格之间的水平/垂直间距
  • GridSpecFromSubplotSpec 把每个大单元格拆分成2行1列的子布局,内部的hspace控制组内上下子图的间距
  • 我加入了phase_offset变量让每个组的曲线略有差异,方便你直观区分;实际使用时直接替换成你的业务数据即可

方法二:使用subplot_mosaic(直观易读)

如果你觉得嵌套GridSpec有点抽象,Matplotlib 3.3+支持的subplot_mosaic可以用更直观的字符串定义布局结构:

import matplotlib.pyplot as plt
import numpy as np

# 生成通用的X轴数据
x = np.linspace(0, 10, 100)

# 用字符串定义布局:前两行是第一行的3组垂直子图,后两行是第二行的3组
mosaic = [
    ["g1_top", "g2_top", "g3_top"],
    ["g1_bot", "g2_bot", "g3_bot"],
    ["g4_top", "g5_top", "g6_top"],
    ["g4_bot", "g5_bot", "g6_bot"],
]

# 创建画布和子图对象
fig, axs = plt.subplot_mosaic(
    mosaic,
    figsize=(16, 8),
    gridspec_kw={"hspace": 0.2, "wspace": 0.3}  # 控制全局间距
)

# 定义所有组的映射关系:顶部子图、底部子图、相位偏移
groups = [
    ("g1_top", "g1_bot", 0),
    ("g2_top", "g2_bot", 0.5),
    ("g3_top", "g3_bot", 1.0),
    ("g4_top", "g4_bot", 1.5),
    ("g5_top", "g5_bot", 2.0),
    ("g6_top", "g6_bot", 2.5),
]

# 遍历每个组完成绘图
for top_key, bot_key, phase in groups:
    ax_top = axs[top_key]
    ax_bottom = axs[bot_key]
    
    # 绘制顶部曲线
    y1 = np.sin(x + phase)
    ax_top.plot(x, y1, label=f"sin(x + {phase:.1f})", color="blue")
    ax_top.set_ylabel("Top Y-Axis")
    ax_top.set_title(f"Group {top_key[1]}")
    ax_top.legend()
    
    # 绘制底部曲线
    y2 = np.cos(x + phase)
    ax_bottom.plot(x, y2, label=f"cos(x + {phase:.1f})", color="orange")
    ax_bottom.set_ylabel("Bottom Y-Axis")
    ax_bottom.set_xlabel("Shared X-Axis")
    ax_bottom.legend()

plt.tight_layout()
plt.show()

关键说明:

  • mosaic 列表用字符串清晰描述了布局结构,前两行对应大布局的第一行3组,后两行对应大布局的第二行3组
  • 我们把每个组的子图键和参数存在groups列表中,循环绘图逻辑更简洁
  • 这种方式的优势是布局一目了然,适合结构规整的嵌套需求

两种方法都能完美实现你要的效果:2行3列的大布局,每个位置包含2个垂直对齐的子图,且每个子图都保留了你最初示例中的标题、标签和图例结构。

备注:内容来源于stack exchange,提问作者HenDoNR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:32:58