matplotlib:共享轴上的绘图顺序是否应该影响轴限制?

matplotlib: Is the order of plot on shared axes supposed to affect the axes limits?

两个取值范围不同的变量绘制在各自的子图中,但它们的子图共用y轴,所以只有一个y轴范围。 y 轴范围是否应该取决于哪个变量进入哪个子图?

例如,假设

x = np.linspace(-100, 100, 1000)

何时

y1 = 5e0 * np.sin(x / 5) + 7
y2 = 2e0 * np.sin(x / 5) + 7

,哪个子图采用哪个变量似乎并不重要。

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 4))
axs[0].plot(x, y1)
axs[1].plot(x, y2)
axs[0].get_shared_y_axes().join(*axs)
all([ax.set_yscale('log') == None for ax in axs])

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 4)) 
axs[0].plot(x, y2)
axs[1].plot(x, y1)
axs[0].get_shared_y_axes().join(*axs)
all([ax.set_yscale('log') == None for ax in axs])

给出相同的通用 y 轴范围。

但是,当

y1 = 5e5 * np.sin(x / 5) + 5.5e5
y2 = 2e5 * np.sin(x / 5) + 5.5e5

,事实并非如此,看起来常见的y轴范围是由最后一个子图中的变量范围决定的。这意味着如果最后一个子图中的变量的范围小于第一个子图中的变量,则第一个子图中的变量的某些部分被裁剪掉了。

这种行为是预期的吗?因为这意味着范围较大的变量总是需要最后绘制,以便完全覆盖所有变量。

我可以在 matplotlib 1.4.3 上重现此问题,假设这是一个已在更高版本中修复的错误。与语法相同的行为,

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 4), sharey=True)

最好的办法是更新 matplotlib,但您可以手动指定轴范围以根据您的情况进行修复,

[ax.set_ylim([np.min([y1,y2]),np.max([y1,y2])) for ax in axs]

如此完整的代码,

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 4))
axs[0].plot(x, y1)
axs[1].plot(x, y2)
axs[0].get_shared_y_axes().join(*axs)
for ax in axs:
    all([ax.set_yscale('log') == None ])
    ax.set_ylim([np.min([y1,y2]),np.max([y1,y2])])

plt.show()