如何调整Matplotlib Gridspec子图间距及第三行列标题间距
解决Matplotlib 3×2子图布局及标题重叠问题
以下是满足需求的具体实现方案,通过GridSpec灵活控制行间距,同时解决第三行标题重叠问题:
完整代码示例
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec # 固定画布宽高 fig = plt.figure(figsize=(10, 8)) # 配置3行2列的网格:列间无间距,第一二行间距为0,第二三行间距设为0.5(可按需调整) gs = GridSpec(3, 2, wspace=0, hspace=[0, 0.5], height_ratios=[1, 1, 1]) # 创建各子图 ax_a = fig.add_subplot(gs[0, 0]) ax_b = fig.add_subplot(gs[0, 1]) ax_c = fig.add_subplot(gs[1, 0]) ax_d = fig.add_subplot(gs[1, 1]) ax_e = fig.add_subplot(gs[2, 0]) ax_f = fig.add_subplot(gs[2, 1]) # 设置子图标题,解决第三行标题重叠问题 ax_a.set_title('(a)') ax_b.set_title('(b)') ax_c.set_title('(c)') ax_d.set_title('(d)') # 方式1:用LaTeX间距命令添加空白 ax_e.set_title('(e) \\hspace{1.5em}') ax_f.set_title('\\hspace{1.5em} (f)') # 方式2:调整标题x坐标(替代方案) # ax_e.set_title('(e)', x=0.4) # ax_f.set_title('(f)', x=0.6) # 可选:优化第一二行子图视觉紧凑度,隐藏相邻边框 ax_a.spines['bottom'].set_visible(False) ax_c.spines['top'].set_visible(False) ax_b.spines['bottom'].set_visible(False) ax_d.spines['top'].set_visible(False) # 可选:隐藏第一行子图x刻度,第二行子图x刻度移至顶部(按需调整) ax_a.tick_params(axis='x', bottom=False, labelbottom=False) ax_b.tick_params(axis='x', bottom=False, labelbottom=False) ax_c.tick_params(axis='x', top=True, labeltop=True, bottom=False, labelbottom=False) ax_d.tick_params(axis='x', top=True, labeltop=True, bottom=False, labelbottom=False) plt.show()
关键细节说明
- 行间距控制:通过
GridSpec的hspace参数传入列表[0, 0.5],分别指定第一行与第二行的间距为0,第二行与第三行的间距为0.5(数值可根据需求调整);wspace=0实现列间无间距。 - 标题重叠解决:两种常用方式:
- 使用LaTeX的
\hspace{}命令添加指定宽度的空白(代码中需转义反斜杠); - 调整标题的
x坐标,将两个标题分别向左右偏移,避免中间重叠。
- 使用LaTeX的
- 固定宽高:通过
plt.figure(figsize=(10, 8))设置画布的固定宽度和高度,数值可根据实际需求修改。
内容的提问来源于stack exchange,提问作者laolux
相关产品推荐
相关产品推荐

