上下文: 我有图像的 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
因此,人们会期望下面的示例以相同的宽度垂直堆叠两个图像。然而事实并非如此。这就是我的发现:
您可以看到第二个图像较小,但是,我强调,两者具有相同的 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