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

如何在嵌套GridSpec与Constrained Layout下调整子图间距?

解决方案

要在Constrained Layout模式下实现子图对间大间距、子图填满画布,同时支持添加跨子图的色条,核心是正确嵌套GridSpec,让外层GridSpec控制子图对之间的间距,内层GridSpec控制每对子图内部的间距。

代码实现

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.cm import ScalarMappable
from matplotlib.colors import Normalize

# 创建画布并开启Constrained Layout
fig = plt.figure(figsize=(8, 10), constrained_layout=True)

# 外层GridSpec:3行1列,控制子图对之间的上下间距(hspace)
outer_gs = GridSpec(3, 1, figure=fig, hspace=0.5)  # hspace是子图对之间的间距

# 循环创建每对子图
for pair_idx in range(3):
    # 内层GridSpec:1行2列,控制每对子图内部的左右间距(wspace)
    inner_gs = outer_gs[pair_idx].subgridspec(1, 2, wspace=0.1)
    # 添加子图
    ax_left = fig.add_subplot(inner_gs[0])
    ax_right = fig.add_subplot(inner_gs[1])
    # 示例内容(可替换为你的绘图代码)
    ax_left.text(0.5, 0.5, f'对子{pair_idx+1} 左', ha='center', va='center', fontsize=12)
    ax_right.text(0.5, 0.5, f'对子{pair_idx+1} 右', ha='center', va='center', fontsize=12)

# 添加跨所有子图的色条
norm = Normalize(vmin=0, vmax=1)
sm = ScalarMappable(norm=norm, cmap='viridis')
sm.set_array([])
# 色条垂直放置在画布右侧,适配所有子图高度
cbar = fig.colorbar(sm, ax=fig.get_axes(), orientation='vertical', fraction=0.02, pad=0.05)
cbar.set_label('色条标签', fontsize=10)

plt.show()

关键说明

  • 外层GridSpec:通过hspace参数单独控制3对子图之间的上下间距,不会影响每对子图内部的左右间距。
  • 内层GridSpec:通过wspace参数设置每对子图内部的紧凑间距,满足你对不同间距的差异化需求。
  • Constrained Layout适配:开启constrained_layout=True后,Matplotlib会自动让子图填满画布,同时尊重嵌套GridSpec的间距设置,不会出现布局错乱。
  • 跨子图色条:通过ax=fig.get_axes()将色条关联到所有子图,确保色条高度与整个子图区域对齐。

内容的提问来源于stack exchange,提问作者wfsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:22:52