2017-03-09 58 views
1

具有不同範圍的兩個變量將被繪製在它們自己的子圖中,但是它們的子圖共享它們的y軸,所以只有一個y軸範圍。 y軸範圍應該取決於哪個變量進入哪個子圖?matplotlib:共享軸上的繪圖順序是否應該影響軸限制?

例如,假設

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軸範圍是由在最後副區的變量的範圍內確定。這意味着,如果最後一個子圖中的變量的範圍小於第一個子圖中的變量,則第一個子圖中的變量將裁剪掉一部分。

預計這種行爲?因爲這意味着最大範圍的變量總是需要最後繪製以全面覆蓋所有變量。

+2

用matplotlib 2.0.0按預期工作。這裏沒有裁剪線條。 – Goyo

回答

2

我可以在matplotlib 1.4.3上重現這一點,假設它是一個在以後的版本中已修復的bug。相同的行爲與語法,

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()