如何在嵌套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
相关产品推荐
相关产品推荐

