我有3个不同尺寸(WxH)的图像:(174x145)的4张图像,(145x145)的4张图像和(145x174)的4张图像。我可以删除列之间的空间,但不能删除行之间的空间。有什么建议么?
这是我的代码:
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")
答案 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()
不幸的是,此解决方案使您几乎获得所需的输出,但可能由于四舍五入的影响而并非如此。但是它足够接近,我认为如果您可以使用稍微有点不正方形的像素,就可以使用aspect='auto'
。
(...)
ax.imshow(p[i,j].T, aspect='auto', origin="lower", cmap=next(cmaps))
(...)