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

如何创建像素大小相同的python imshow子图,python,matplotlib,imshow,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[

我正在尝试创建具有相同像素大小的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调整的绘图:

使用ylim调整进行绘图:


原则上,您只需将图形大小的宽度设置为足够小,以限制子地块的宽度。例如,
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\u layout()
,请在调用该函数之前执行此操作。另外,您肯定需要在这里将唯一的自由参数
wspace
设置为
“auto”
之外的其他参数
wspace=1
意味着绘图之间的空间与其宽度相同

结果是子图的宽度大小相同


当使用不同的体形尺寸时,您是否知道如何修改此选项?例如,将第三行更改为“fig,ax=plt.subplot(1,2,figsize=(40,30)),似乎会产生具有不同大小像素的子图。两个子图中的像素相同,与图形大小无关。我怀疑如果您使用
figsize=(40,30)
并且不更改dpi,将导致图形对于您的屏幕太大,在这种情况下,图形窗口将缩小到屏幕大小,所有精确计算的值都将无效。