2017-07-26 50 views
2

問題如何在用兩個座標軸繪圖時填充圖例背景顏色?

我有一個有2個y軸的圖,每個對應一組線。實線對應於左側的y軸,而虛線對應於右側的y軸。我也有一個圖例,我希望它只使用實線作爲鍵,因爲虛線具有相同的標籤,具體取決於它們的顏色。

問題是當我爲實線繪製圖例,然後是虛線代碼時,網格線顯示的是圖例。我需要爲兩個軸指定網格線,因爲它們不會以其他方式顯示,並且如果將圖例移動到虛線,則會將虛線用作關鍵點。我也不想改變我的繪圖順序。

代碼和情節

#Plot 
x= np.arange(0,3) 
fig,ax = plt.subplots(figsize=(6,6)) 
#DOD 
dod1 = ax.plot(x, ctrl_dod, color='r',  label='CTRL' ) 
dod2 = ax.plot(x, mfkc_dod, color='#e68a00', label='MFKC' ) 
dod3 = ax.plot(x, gses_dod, color='green', label='GSES' ) 
dod4 = ax.plot(x, gses3_dod, color='blue', label='GSES-3') 
dod5 = ax.plot(x, gses4_dod, color='purple', label='GSES-4') 
dod6 = ax.plot(x, mera_dod, color='brown', label='MERRA2') 
ax.xaxis.grid(True) 
ax.set_ylim([0.02,0.044]) 
ax.set_yticks(np.arange(0.02,0.045,0.004)) 
ax.set_xlabel('Month') 
ax.set_ylabel('Dust Optical Depth (550 nm)') 
ax.set_title('Global Mean DOD and DCM') 
legend = ax.legend() 
legend.get_frame().set_facecolor('white') 

#DCM 
ax2 = ax.twinx() 
dcm1 = ax2.plot(x, ctrl_dcm*1e6, color='r',  linestyle='--', label='CTRL' ) 
dcm2 = ax2.plot(x, mfkc_dcm*1e6, color='#e68a00', linestyle='--', label='MFKC' ) 
dcm3 = ax2.plot(x, gses_dcm*1e6, color='green', linestyle='--', label='GSES' ) 
dcm4 = ax2.plot(x, gses3_dcm*1e6, color='blue', linestyle='--', label='GSES-3') 
dcm5 = ax2.plot(x, gses4_dcm*1e6, color='purple', linestyle='--', label='GSES-4') 
dcm6 = ax2.plot(x, mera_dcm*1e6, color='brown', linestyle='--', label='MERRA2') 
ax2.xaxis.grid(True) 
ax2.yaxis.grid(True) 
ax2.set_xlabel('Month') 
ax2.set_ylabel('Dust Column Mass (mg m-2)') 

#Limits 
axes = plt.gca() 
axes.set_xlim([-0.25,2.25]) 

#Labels 
axes.set_xticks(x) 
axes.set_xticklabels(['June','July','August']) 

#Save 
pylab.savefig('dod+dcm.png') 

enter image description here

問題

我怎樣才能

一)有傳說鍵用實線和

b)有傳說不透明白色的背景嗎?

+1

「有圖例按鍵使用實線」 - 圖像中的圖例按鍵已經是實線,對嗎? –

+0

我不明白「我需要爲這兩個軸指定網格線,因爲它們不會顯示出來」。只使用ax.grid()而不顯示ax2的網格應直接解決問題。如果沒有,我們需要問題的[mcve]。 – ImportanceOfBeingErnest

+0

重要性 - 好吧,實際上這個特定的例子適用於軸匹配。但是,昨天我的左右軸有不同的網格線,這就是爲什麼我需要爲ax和ax2設置yaxis.grid(True)的原因。如果網格不匹配,那麼對其他人也可能有幫助。 – ChristineB

回答

4

您可以創建第二個軸的圖例,但使用第一個軸的手柄。

h, l = ax.get_legend_handles_labels() 
legend = ax2.legend(h,l, facecolor="white") 
+0

我得到第二行的錯誤 - 「TypeError:__init __()有一個意外的關鍵字參數'facecolor'」。但是,如果我取出那個facecolor位並將「legend.get_frame()。set_facecolor('white')」添加到新行,它就可以工作!修改你的答案,我會接受它。 – ChristineB

+0

['facecolor'](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.legend)是圖例的記錄參數。如果您使用的是舊版本的matplotlib,您當然可以使用不同的方式設置facecolor。 – ImportanceOfBeingErnest

+0

這是完全可能的,因爲我使用Python的網絡範圍的安裝,我不知道它是什麼版本。我會接受你的答案,因爲把手位是我真正需要的。 – ChristineB