matplotlib 如何防止图例顶部出现线条?

lfapxunr  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(190)

我正在用matplotlib绘制一个2轴图形。我遇到的问题是,当我绘制第二条线(pH)时,它出现在前面的图例的顶部。有没有办法将这条线发送到后台(就像我们在Office Word中所做的那样)?
我还想知道是否有办法将两个不同的图例(每个轴一个)合并到一个图例中。

下面是代码:

fig, ax1 = plt.subplots()

ax1.set_xlabel('Tiempo (horas)')
ax1.set_ylabel('Concentración (mg/L)')
ax1.plot(t,NH4,'m-',label='NH4')
ax1.plot(t,NO2,'b--',label='NO2')
ax1.plot(t,NO3,'g-',label='NO3')
ax1.plot(t,OD,'c+',label='OD')

plt.grid(axis='both')

ax2 = ax1.twinx()

ax2.set_ylabel('pH',color='red')
ax2.plot(t,pH,'r',label='pH')
ax2.tick_params(axis='y', labelcolor='red')
ax2.legend(loc='center right')
ax1.legend(loc='upper center', mode='expand', ncol=len(ax1.lines))
plt.show()

我想要么发送红线到背景,或合并成一个单一的两个标签。

2jcobegt

2jcobegt1#

可以使用每个面片(plotlegend)上的zorder属性(https://matplotlib.org/3.1.1/gallery/misc/zorder_demo.html)手动控制对象在地物上的垂直放置。
如果您不指定此参数,matplotlib将尝试自动计算。

nhhxz33t

nhhxz33t2#

除了@Droid answer之外,请注意,您可以使用plt.legend().set_zorder(X)(或.set(zorder=X))直接将图例的zorder设置为一个较高的值(绘制在绘图上)。

lh80um4z

lh80um4z3#

线和图例都有相同的zorder。因此,它们按照编写代码的顺序呈现。获得正确效果的方法是将ax1的zorder设置得更高(比如1)。但是这会把pH线推到后面,使其不可见。所以,接下来关闭ax2的帧,这样你就可以看到线了。然后打开ax2的框架。这会给予你所需要的效果,并保持pH线在图例后面。
现在,要合并两个图例,使用get_legend_handles_labels()获取图例句柄和标签,然后添加句柄和标签并创建一个合并的图例。
更新后的代码如下所示。希望这对你有帮助...

fig, ax1 = plt.subplots()
ax1.set_xlabel('Tiempo (horas)')
ax1.set_ylabel('Concentración (mg/L)')
ax1.plot(t,NH4,'m-',label='NH4')
ax1.plot(t,NO2,'b--',label='NO2')
ax1.plot(t,NO3,'g-',label='NO3')
ax1.plot(t,OD,'c+',label='OD')
plt.grid(axis='both')
ax2 = ax1.twinx()
ax2.set_ylabel('pH',color='red')
ax2.plot(t,pH,'r',label='pH')
ax2.tick_params(axis='y', labelcolor='red')

# Get the handles and labels for ax1 and ax2
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()

# Create legend by adding the columns
legend=ax1.legend(h1+h2, l1+l2,loc='upper center', mode='expand', ncol=len(ax1.lines)+1)

ax1.set_zorder(1) # make it on top
ax1.set_frame_on(False) # make it transparent
ax2.set_frame_on(True) # make sure there is any background

plt.show()

输出图

相关问题