首页 > 编程问答 >sharex 和 imshow 不会生成相同宽度的图

sharex 和 imshow 不会生成相同宽度的图

时间:2024-07-21 02:43:19浏览次数:3  
标签:python numpy matplotlib

上下文: 我有图像的 x,y 和 x,z 投影。我希望两个图像垂直堆叠,共享相同的宽度。

我的尝试: 我尝试了以下方法:

import numpy as np
import matplotlib.pyplot as plt

N1, N2 = 256, 512
table1 = np.random.rand(N1, N1)
table2 = np.random.rand(N1, N2)

f, axes = plt.subplots(2,sharex=True)
f.subplots_adjust(hspace=0,wspace=0)                                                                                                            
axes[0].imshow(table1.T,extent = [0, N1, 0, N1])
axes[1].imshow(table2.T,extent = [0, N1, 0, N2])

错误的结果: 注意 axes[0] axes[1] 共享相同的内容X 范围和 x 轴上的像素数相同,因为我使用了 sharex=True 因此,人们会期望下面的示例以相同的宽度垂直堆叠两个图像。然而事实并非如此。这就是我的发现:

output of the snippet

您可以看到第二个图像较小,但是,我强调,两者具有相同的 x 范围和 x 轴上相同的像素数。

所以我的问题是: 如何垂直堆叠两个具有相同范围和 x 轴像素的图像(但是我需要 y 轴上的像素数可能有所不同)

为什么不使用 aspect='auto' 有人可能会想只需添加 aspect=auto 即可解决问题。虽然图像将以相同的宽度结束,但它们也将具有相同的高度。然而,第二张图像的 y 范围更大(y 轴像素的两倍)。我希望图像不被拉伸,以保持其纵横比。


问题在于 imshow 默认使用每个轴的相等纵横比。这意味着,如果一个轴的范围大于另一个轴,则图像将被拉伸以保持纵横比相等,即使指定了 extent

可以在 imshow 中将 aspect='auto' 添加到两个绘图中来解决此问题。这将允许图像根据轴范围进行拉伸,并且将在 x 轴上获得所需的共享宽度。

以下是更新的代码:

import numpy as np
import matplotlib.pyplot as plt

N1, N2 = 256, 512
table1 = np.random.rand(N1, N1)
table2 = np.random.rand(N1, N2)

f, axes = plt.subplots(2, sharex=True)
f.subplots_adjust(hspace=0, wspace=0)

axes[0].imshow(table1.T, extent=[0, N1, 0, N1], aspect='auto')
axes[1].imshow(table2.T, extent=[0, N1, 0, N2], aspect='auto')

plt.show()

这将生成两个图像,它们在 x 轴上具有相同的宽度,但高度不同,反映了它们的 y 范围差异。

标签:python,numpy,matplotlib
From: 78770307

相关文章