Matplotlib Gridspsec行之间的间距

时间:2019-08-09 10:03:00

标签: matplotlib

我有3个不同尺寸(WxH)的图像:(174x145)的4张图像,(145x145)的4张图像和(145x174)的4张图像。我可以删除列之间的空间,但不能删除行之间的空间。有什么建议么? enter image description here

这是我的代码:

fig = plt.figure(figsize=(10, 10))
gs = fig.add_gridspec(3, 4, hspace=0, wspace=0)
for r in range(3):
    for c in range(4):
        ax = fig.add_subplot(gs[r, c])
        ax.imshow(slices[r][c].T, origin="lower", cmap="gray")
        ax.axis("off")

1 个答案:

答案 0 :(得分:0)

如评论中所建议,您需要为GridSpec设置height_ratios,但这还不够。您还需要调整图形的大小,以使图形的宽高比与图像的总宽高比匹配。但是这里存在另一个问题,因为在绘制图像时会缩放轴(由于aspect='equal'),并且因为它们的宽度/高度比并不相同。

我提出的解决方案是,首先计算图形的尺寸,一旦将其拉伸到通用的宽度大小,然后使用正确的信息来调整图形尺寸和GridSpec的height_ratios。

# this is just for visualization purposes
cmaps = iter([   'flag', 'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern',
            'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg',
            'gist_rainbow', 'rainbow', 'jet', 'nipy_spectral', 'gist_ncar'])



sizes = [(174,145), (145,145), (145,174)]

# create random images
p = []
for s in sizes:
    p.append([np.random.random(size=s) for _ in range(4)])
p = np.array(p)


max_w = max([w for w,h in sizes])
new_sizes = np.array([(w*max_w/w, h*max_w/w) for w,h in sizes])
print(new_sizes)

total_w = 4*new_sizes[:,0].sum()
total_h = 3*new_sizes[:,1].sum()
eps=10/total_w
fig = plt.figure(figsize=(eps*total_w,eps*total_h))
gs0 = matplotlib.gridspec.GridSpec(3,4, height_ratios=[h for w,h in new_sizes], hspace=0, wspace=0)
for i in range(3):
    for j in range(4):
        ax = fig.add_subplot(gs0[i,j])
        ax.imshow(p[i,j].T, origin="lower", cmap=next(cmaps))
        ax.set_axis_off()

enter image description here

不幸的是,此解决方案使您几乎获得所需的输出,但可能由于四舍五入的影响而并非如此。但是它足够接近,我认为如果您可以使用稍微有点不正方形的像素,就可以使用aspect='auto'

(...)
ax.imshow(p[i,j].T, aspect='auto', origin="lower", cmap=next(cmaps))
(...)

enter image description here