2013-11-27 62 views
6

是否可以繪製兩個獨立的y軸,使刻度線對齊?matplotlib align twin twin刻度標記

下面是一個解決方案的一個例子。我已經使用twinx加倍了y軸,但刻度線未對齊,網格線在圖上形成了一個尷尬的圖案。有沒有辦法讓刻度線共享相同的位置,但是對應於不同的y值?在下面的示例中,我希望左側的刻度標記5與右側的刻度標記6處於同一垂直位置。

import numpy as np 

a = np.random.normal(10, 3, size=20) 
b = np.random.normal(20, 5, size=40) 

fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 
ax1.hist(a) 
ax2.hist(b) 

histograms

此工作的總點是使網格線爲兩個軸重疊。

回答

9

您需要手動設置yticks,因爲它們會自動計算,導致變化。添加這樣的事情:

ax1.set_yticks(np.linspace(ax1.get_ybound()[0], ax1.get_ybound()[1], 5)) 
ax2.set_yticks(np.linspace(ax2.get_ybound()[0], ax2.get_ybound()[1], 5)) 

這裏我們設使用的軸的邊界之間5點的數組的ytick位置。既然你有一個柱狀圖,你可以只設置較低的值爲零在每種情況下,你可能希望有上限稍大,所以我反而有

ax1.set_yticks(np.linspace(0, ax1.get_ybound()[1]+1, 5)) 
ax2.set_yticks(np.linspace(0, ax2.get_ybound()[1]+1, 5)) 

給人一種陰謀(帶的變化顏色和透明度(阿爾法)爲了清楚起見):`AX1:

enter image description here

+0

由於邊界總是由兩個數字定義(除非未定義),下面也已經限定的軸線的邊界之間產生5個點。 set_yticks(np.linspace(* ax1.get_ybound(),5)'。 –