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

如何在Python中调整7×4布局子图的多余空白间距?

嘿,这个子图空白的问题我之前折腾过好多次,matplotlib的布局逻辑确实需要点小技巧才能调到满意。针对你4行7列子图的情况,我整理了几个实用的解决办法:

解决Matplotlib 4x7子图多余空白的方案

方法1:用plt.subplots配合gridspec_kw精细控间距

直接用plt.subplots创建画布和子图数组,通过gridspec_kw参数可以同时控制子图之间的间距,以及整体画布的上下左右边距,一次性解决两种空白问题。示例代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.arange(100)

# 创建画布和子图数组,按需调整画布尺寸与布局参数
fig, axs = plt.subplots(4, 7, figsize=(14, 8),
                        gridspec_kw={'wspace': 0.1,  # 子图间水平间距(按子图宽度比例)
                                     'hspace': 0.1,  # 子图间垂直间距(按子图高度比例)
                                     'left': 0.05,   # 整体左边距(画布宽度比例,0=最左,1=最右)
                                     'right': 0.95,  # 整体右边距
                                     'top': 0.95,    # 整体上边距
                                     'bottom': 0.05})# 整体下边距

# 遍历所有子图绘制内容
for ax in axs.flat:
    ax.scatter(x, y)
    # 如果不需要刻度,直接隐藏能进一步节省空间
    # ax.set_xticks([])
    # ax.set_yticks([])

plt.show()

你可以根据自己的需求微调这些参数,数值越小,对应的空白就越窄。

方法2:调整tight_layout()的参数优化默认布局

如果你习惯用原来的subplot循环写法,那可以给tight_layout()传入自定义参数,替代默认的宽松设置:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.arange(100)

for i in range(28):
    plt.subplot(4, 7, i+1)
    plt.scatter(x, y)
    # 可选:隐藏刻度减少冗余空间
    # plt.xticks([])
    # plt.yticks([])

# 自定义tight_layout的空白参数,pad控制子图与画布边缘的距离,h/w_pad控制子图间间距
plt.tight_layout(pad=0.2, h_pad=0.1, w_pad=0.1)
plt.show()

默认的pad=1.08会留很大空白,调小后就能让布局紧凑很多。

方法3:用GridSpec实现极致灵活的布局

如果需要更精细的定制(比如不同行/列的子图大小不同),可以用GridSpec来手动控制布局:

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

x = np.arange(100)
y = np.arange(100)

fig = plt.figure(figsize=(14, 8))
# 创建GridSpec对象,设置间距与边距
gs = GridSpec(4, 7, figure=fig,
              wspace=0.1, hspace=0.1,
              left=0.05, right=0.95,
              top=0.95, bottom=0.05)

# 遍历行列创建子图并绘制
for i in range(4):
    for j in range(7):
        ax = fig.add_subplot(gs[i, j])
        ax.scatter(x, y)
        # ax.set_xticks([])
        # ax.set_yticks([])

plt.show()

这种方式和方法1的核心逻辑一致,但适合处理更复杂的布局场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:30:34