2017-07-26 119 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