使用 imshow 和 twiny:无法设置 xlim

Using imshow and twiny: cannot set xlim

我正在尝试使用 pyplot 在图像上绘制一些线条。另外,我需要两个 x 轴,一个在底部,一个在顶部。假设下面的那个应该有五个刻度,范围从 0 到 5,上面的那个也应该有五个刻度,但范围从 36 到 41,并且这些刻度应该对齐。这很容易完成:

from matplotlib import pyplot as plt

fig, ax1 = plt.subplots()
ax1.axis([0,5,10,20])      # set bottom axis limits
plt.grid()
ax2 = plt.twiny()
ax2.axis([36,41,10,20])    # set top axis limits
plt.show()

产生:

但是,一旦我使用 imshow,我似乎无法正确设置底部 x 轴的限制:

import numpy as np
from matplotlib import pyplot as plt
# Using a small checkerboard as image
a = np.array([[0,1],[1,0]])
fig, ax1 = plt.subplots()
ax1.axis([0,5,10,20])     # Set lower axis limits -> are ignored
ax1.imshow(a, extent=(0,5,10,20))
plt.grid()
ax2 = plt.twiny()         # If these two lines are commented
ax2.axis([36,41,10,20])   # imshow behaves as expected
plt.show()

产生:

如何在显示图像的同时保持坐标轴上的刻度线对齐?

这里有两个矛盾的约束:

  • 轴的限制设置。
  • 图像的等长宽比。

您可以放宽其中一项,即如果您想指定限制,请将方面设为自动,

ax1.imshow(a, extent=(0,5,10,20), aspect="auto")