Matplotlib - 使用多个轴时保持纵横比

Matplotlib - Keep aspect ratio when using multiple axes

如何在使用两个 x 轴时保持绘图的纵横比?下面的代码可以很好地显示纵横比为 25/111 的图像。

import numpy as np
import matplotlib.pyplot as plt

data = np.ones((25, 111))
specFig, specAx = plt.subplots()
specAx.set_xlim([0, data.shape[1]])

#newax = specAx.twiny()
#newax.set_xlim([0, data.shape[1]])

specAx.imshow(data, origin="lower")
plt.show()

然而,当取消注释这些线时,它变成了一个相当二次的图像,其第二个 x 轴显示从 0 到 111 的值,而第一个 x 轴仅显示大约 25 个值的剪裁。

很奇怪,我无法使用 axis('tight')axis('scaled') 等、specAx.set_aspect(aspect, adjustable='box')、关闭 autoscale 或其他方式使轴看起来正确。我在 matplotlib 中遇到过类似的双轴问题,作为一种解决方法,使用了 matplotlib 的 parasiteaxis,对于你的情况来说,

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

data = np.ones((25, 111))

specFig = plt.figure()
specAx = host_subplot(111, axes_class=AA.Axes)

specAx.set_xlim([0, data.shape[1]])
specAx.imshow(data, origin="lower")

#Add parasite axis
newax = specAx.get_grid_helper().new_fixed_axis
specAx.axis["top"] = newax(loc="top", axes=specAx)

plt.show()

编辑:如果需要调整顶轴,之前的解决方案可能并不理想(顶轴不是轴对象)。我已经设法使用 box-forced 关键字设置纵横比,如下所示:

import numpy as np
import matplotlib.pyplot as plt

data = np.ones((25, 111))
specFig, specAx = plt.subplots()
specAx.set_xlim([0, data.shape[1]])

newax = specAx.twiny()
newax.set_xlim([0, data.shape[1]])

specAx.imshow(data, origin="lower")
specAx.set_aspect('equal', 'box-forced')
newax.set_aspect('equal', 'box-forced')
plt.show()

然后您应该可以调整刻度等。