Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用两个轴打印时如何填充图例背景色?_Python_Matplotlib_Legend_Fill_Multiple Axes - Fatal编程技术网

Python 使用两个轴打印时如何填充图例背景色?

Python 使用两个轴打印时如何填充图例背景色?,python,matplotlib,legend,fill,multiple-axes,Python,Matplotlib,Legend,Fill,Multiple Axes,问题 我有一个带有两个y轴的绘图,每个y轴对应一组线。实线对应于左y轴,虚线对应于右y轴。我还有一个图例,我希望它仅使用实线作为关键点,因为虚线具有相同的标签,具体取决于它们的颜色 问题是当我为实线绘制图例,然后为虚线绘制代码时,网格线通过图例显示。我需要为两个轴指定网格线,因为它们不会以其他方式显示,如果我将图例移动到虚线,它将使用虚线作为关键点。我也不想改变我的绘图顺序 代码和绘图 #Plot x= np.arange(0,3) fig,ax = plt.subplots(figsize=(

问题

我有一个带有两个y轴的绘图,每个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')

问题

我怎么能


a) 让图例键使用实线和


b) 图例背景为不透明白色?

您可以为第二个轴创建图例,但使用第一个轴的手柄

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

我来这里,因为我有同样的问题,但我想要两个单独的传说,一个为双轴

@ImportanceOfBeingErnest提供的公认答案不再有效,因为它只允许将一个图例附加到
ax2

在这种情况下,@ImportanceOfBeingErnest也提供了另一种解决方案

我将它们都转换为一个函数,我通常在本例中使用该函数,并认为在此处提供该函数会很有用:

def legend_to_ax(ax,ax_placein=None,method=2,**kwargs):
“”“围绕ax.legend(**kwargs)的包装器,它允许具有该legend
放置在轴ax_placein中。
这在绘制多个轴的图例时非常有用,例如使用
ax2=ax1.twinx(),以便在所有轴的顶部显示所有图例。
在这种情况下,提供最上面的轴,例如此处的ax2,作为ax_placein。
Args:
-ax:为其创建图例的轴
-ax_placein:图例应放置的轴(可选)
-方法:在中处理图例放置的方法
斧头。
方法=1…基于
https://stackoverflow.com/a/45336414/7042795
当需要多个图例时,此方法失败
添加到ax_placein中。
方法=2…基于
https://github.com/matplotlib/matplotlib/issues/3706#issuecomment-378407795
这为ax_placein添加了艺术家的传奇
使其不再通过ax.get_legend()显示。
而是解析ax_placein.artists()
-**kwargs:kwargs of ax.legend()
返回:
-腿:图例手柄
"""
如果ax_placein为无:
支腿=轴图例(**kwargs)
elif方法==1:
#基于https://stackoverflow.com/a/45336414/7042795
h、 l=ax.get\u图例\u句柄\u标签()
如果ax_placein不是None:
ax=ax_placein
支腿=轴图例(h、l、**kwargs)
elif方法==2:
#基于https://github.com/matplotlib/matplotlib/issues/3706#issuecomment-378407795
支腿=轴图例(**kwargs)
如果ax_placein不是None:
删除
ax_placein.添加艺术家(腿部)
返回段
因此,使用此函数,您可以简单地执行以下操作

legend=legend\u to\u ax(ax,ax\u placein=ax2,method=1,facecolor=“white”)

legend=legend\u to\u ax(ax,ax\u placein=ax2,method=2,facecolor=“white”)
如果您确实需要两个图例,则应该可以:

legend1=legend\u to\u ax(ax,ax\u placein=ax2,method=2,facecolor=“white”,loc=“左上”)
legend2=图例到ax(ax2,ax\u placein=ax2,method=2,facecolor=“white”,loc=“右上”)

我希望这是一个分享这些信息的合适地方。不过,积分是由于@ImportanceOfBeingErnest。我只是将它们的解决方案合并到此函数中。

“让图例键使用实线”-提供的图像中的图例键已经是实线了,不是吗?我不理解“我需要为两个轴指定网格线,因为它们不会以其他方式显示”。仅使用ax.grid()而不显示ax2的网格可以直接解决此问题。如果没有,我们需要一个问题的答案。重要性-好的,这实际上适用于这个特定的例子,因为轴匹配。不过昨天,我在左轴和右轴上有不同的网格线,这就是为什么我需要为ax和ax2设置yaxis.grid(True)。如果网格不匹配,可能对其他人有帮助。你需要使顶部轴的补丁透明。我明白了,我下面的答案与网格是否存在无关。所以它在两种情况下都能工作。我在第二行中得到一个错误-“TypeError:\uuuu init\uuuu()得到了一个意外的关键字参数“facecolor”。但是,如果我去掉facecolor位并在新行中添加“legend.get_frame().set_facecolor('white')”,它就可以工作了!修改你的答案,我会接受的。这是一个有文字记载的传说。如果您使用的是旧版本的matplotlib,那么当然可以使用不同的方式设置facecolor。这完全是可能的,因为我使用的是网络范围的Python安装,我不知道它是什么版本。我会接受你的回答,因为句柄位是我真正需要的。如果我想要ax的图例和ax2的第二个图例,那么这不起作用。使用此方法创建其中一个时,第二个将消失。。。。但在这种情况下,@ImportanceOfBeingErnest提供的方法会有所帮助