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
相关产品推荐
相关产品推荐

