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

时间:2017-03-09 08:53:58

标签: python matplotlib axes

具有不同范围的两个变量将在它们自己的子图中绘制,但它们的子图共享它们的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轴范围由最后一个子图中的变量范围决定。这意味着如果最后一个子图中的变量的范围小于第一个子图中的变量,则第一个子图中的变量会裁掉一些部分。

预计会出现这种情况吗?因为这意味着具有较大范围的变量总是需要最后绘制,以便完全覆盖所有变量。

1 个答案:

答案 0 :(得分:2)

我可以在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()