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

如何在Matplotlib中单独调整子图特定行间距而非全局应用

解决Matplotlib特定行间距的问题

要实现3列4行子图中,第1-2行、3-4行紧密贴合,仅第2-3行保留间距的需求,不能依赖全局的figure.subplot.hspace参数,而是要用GridSpec做精细化布局,同时配合轴标签/刻度的隐藏避免重叠。以下是两种可行方案:

方案一:单个GridSpec手动调整行间距

创建单个4行3列的GridSpec,先全局设置行间距为0,再单独调整第2行和第3行之间的间距:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# 创建画布
fig = plt.figure(figsize=(10, 12))
# 初始化4行3列的GridSpec,全局行间距设为0
gs = GridSpec(4, 3, figure=fig)
gs.update(hspace=0)

# 手动拉开第2行(索引1)和第3行(索引2)的间距
# 0.1为间距系数,可根据画布大小调整
gs[2, :].top = gs[1, :].bottom - 0.1

# 循环创建子图并处理轴元素
for row in range(4):
    for col in range(3):
        ax = fig.add_subplot(gs[row, col])
        ax.plot([1,2,3], [4,5,6])
        
        # 第1、3行隐藏x轴标签和刻度,避免与下一行重叠
        if row in [0, 2]:
            ax.set_xticklabels([])
            ax.set_xlabel('')
        # 仅保留每列最左侧子图的y轴标签
        if col != 0:
            ax.set_yticklabels([])
            ax.set_ylabel('')
        # 给每组第一行的子图加标题
        if row in [0, 2]:
            ax.set_title(f"Group {row//2 +1} - Subplot ({row+1}, {col+1})")

plt.show()

方案二:拆分GridSpec分组控制

将4行拆分为两组(前两行、后两行),分别创建GridSpec,通过设置两组的上下位置控制组间距,组内行间距设为0:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

fig = plt.figure(figsize=(10, 12))
# 第一组:前两行3列,行间距0,占据画布上半部分
gs_top = GridSpec(2, 3, figure=fig, top=0.95, bottom=0.55, hspace=0)
# 第二组:后两行3列,行间距0,占据画布下半部分,与上组留间距
gs_bottom = GridSpec(2, 3, figure=fig, top=0.45, bottom=0.05, hspace=0)

# 创建上组子图
for row in range(2):
    for col in range(3):
        ax = fig.add_subplot(gs_top[row, col])
        ax.plot([1,2,3], [4,5,6])
        # 上组第一行隐藏x轴
        if row == 0:
            ax.set_xticklabels([])
            ax.set_xlabel('')
        # 非首列隐藏y轴
        if col != 0:
            ax.set_yticklabels([])
            ax.set_ylabel('')
        if row == 0:
            ax.set_title(f"Top Group - Subplot ({row+1}, {col+1})")

# 创建下组子图
for row in range(2):
    for col in range(3):
        ax = fig.add_subplot(gs_bottom[row, col])
        ax.plot([1,2,3], [4,5,6])
        # 下组第一行隐藏x轴
        if row == 0:
            ax.set_xticklabels([])
            ax.set_xlabel('')
        # 非首列隐藏y轴
        if col != 0:
            ax.set_yticklabels([])
            ax.set_ylabel('')
        if row == 0:
            ax.set_title(f"Bottom Group - Subplot ({row+3}, {col+1})")

plt.show()

关键说明

  • 全局hspace=0导致重叠的核心原因是:所有行之间无间距,相邻行的轴标签、刻度会互相覆盖,必须通过隐藏不需要的轴元素+精细化布局解决。
  • GridSpec是Matplotlib中灵活控制子图布局的工具,支持单独调整子图或行/列的位置、间距,完全满足特定行留间距的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:50:44