如何创建具有相同像素大小的python imshow子图

时间:2018-11-16 22:28:14

标签: python matplotlib imshow

我正在尝试创建具有相同像素大小的imshow子图,而不会自动缩放图形的高度,但是我无法弄清楚该怎么做。

理想情况下,我正在寻找与第二张图片相似的图,没有多余的空白(ylim从-0.5到4.5),并且可能垂直居中。我的图片将始终具有相同的宽度,因此,如果我可以固定子图的宽度而不是固定的高度,那可能会有所帮助。有人有什么想法吗?

close('all')
f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
tight_layout()

f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
ax[1].set_ylim((29.5,-0.5))
tight_layout()

未进行ylim调整的图:

Plot without ylim adjustment

使用ylim调整的图:

Plot with ylim adjustment

1 个答案:

答案 0 :(得分:0)

原则上,您可以使图形尺寸的宽度足够小,从而限制子图的宽度。例如。 figsize=(2,7)将在这里工作。

对于自动解决方案,您可以调整子图参数,以使左右边距限制子图宽度。这显示在下面的代码中。 假设有一排子图,并且所有图像在水平方向上都具有相同的像素数。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,2)
im1 = ax[0].imshow(np.random.rand(30,4))
im2 = ax[1].imshow(np.random.rand(4,4))


def adjustw(images, wspace="auto"):
    fig = images[0].axes.figure
    if wspace=="auto":
        wspace = fig.subplotpars.wspace
    top = fig.subplotpars.top
    bottom = fig.subplotpars.bottom
    shapes = np.array([im.get_array().shape for im in images])
    w,h = fig.get_size_inches()
    imw = (top-bottom)*h/shapes[:,0].max()*shapes[0,1] #inch
    n = len(shapes)
    left = -((n+(n-1)*wspace)*imw/w - 1)/2.
    right = 1.-left
    fig.subplots_adjust(left=left, right=right, wspace=wspace)

adjustw([im1, im2], wspace=1)

plt.show()

如果需要使用tight_layout(),请在调用函数之前使用。另外,您肯定需要在此处将唯一的可用参数wspace设置为"auto"以外的其他参数。 wspace=1表示图之间的宽度与其宽度一样。

结果是一个图形,其中子图的宽度相同。

enter image description here