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

Matplotlib子图对齐与等间距设置问题求助

Matplotlib子图对齐与等间距设置问题求助

我现在在用Matplotlib做带多个子图的图像,绘制子图本身没什么问题,但对齐和间距设置一直卡壳——我想要所有子图的外边缘完全对齐,而且子图之间的水平、垂直间距必须完全相等。

目前我已经实现了子图之间无间距的效果,代码如下:

import numpy as np
import matplotlib.pyplot as plt

plt.set_cmap('jet')
plt.close()

dim1 = 81
dim2 = 445
rad = 10

arr1 = np.random.rand(dim1, dim2) # 示例数据,对应顶部子图
arr1[round(dim1/2 - rad):round(dim1/2 + rad), round(dim1/2 - rad):round(dim1/2 + rad)] += 6
arr1[round(dim1/2 - rad):round(dim1/2 + rad), round(-dim1/2 - rad):round(-dim1/2 + rad)] += 3

arr2 = arr1[:, :dim1] # 对应左下角子图
arr3 = arr1[:, -dim1:] # 对应右下角子图

xpix = dim2 # 图像的虚拟宽度像素数
ypix = xpix/2 + dim1 # 图像的虚拟高度像素数
ratio = xpix/ypix # 图像宽高比
size = 7

fig = plt.figure(figsize = (size*ratio, size))

grid = plt.GridSpec(2, 2, wspace = 0, hspace = 0, left = 0, right = 1, top = 1, bottom = 0, height_ratios = [dim1, xpix/2])

ax1=fig.add_subplot(grid[0,:]) # 顶部子图
ax1.axis(False)
#ax1.set_anchor('N')
ax1.imshow(arr1, aspect = 'equal')

ax2=fig.add_subplot(grid[1,0]) # 左下角子图
ax2.axis(False)
ax2.set_anchor('SW')
ax2.imshow(arr2, aspect = 'equal')

ax3=fig.add_subplot(grid[1,1]) # 右下角子图
ax3.axis(False)
ax3.set_anchor('SE')
ax3.imshow(arr3, aspect = 'equal')

plt.show()

这段代码生成的是无间距的子图效果。

但我尝试添加间距时一直没成功,比如我试过把GridSpec那行改成:

space = 0.01
grid = plt.GridSpec(2, 2, wspace = space, hspace = space*ratio, left = 0, right = 1, top = 1, bottom = 0, height_ratios=[dim1, xpix*(1-space)/2])

有时候调整space、图像尺寸或像素数能凑出效果,但大多数时候都不行。我还试过其他方法:

  • 用3×3的GridSpec,把中间行列留作间距,设置wspace=0、hspace=0
  • 用多个GridSpec,分别指定每个子图的top/bottom/left/right来控制间距和对齐

这些方法的效果都不理想。另外有个关键要求:每个子图的像素必须是正方形(我注意到很多GridSpec示例用空的子图,好像会通过改变宽高比来实现对齐,但我不能这么做)。

我的最终目标是:能任意设置间距、图像尺寸和输入数组,不用反复调整参数就能实现子图外边缘对齐、横竖间距相等的效果。

补充说明:我期望的最终效果是类似这样的「理想输出」,并且可以自由选择子图之间的间距大小。

备注:内容来源于stack exchange,提问作者senga9872

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:45:31