我正在用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()
我想要么发送红线到背景,或合并成一个单一的两个标签。
3条答案
按热度按时间2jcobegt1#
可以使用每个面片(
plot
,legend
)上的zorder
属性(https://matplotlib.org/3.1.1/gallery/misc/zorder_demo.html)手动控制对象在地物上的垂直放置。如果您不指定此参数,
matplotlib
将尝试自动计算。nhhxz33t2#
除了@Droid answer之外,请注意,您可以使用
plt.legend().set_zorder(X)
(或.set(zorder=X)
)直接将图例的zorder
设置为一个较高的值(绘制在绘图上)。lh80um4z3#
线和图例都有相同的zorder。因此,它们按照编写代码的顺序呈现。获得正确效果的方法是将
ax1
的zorder设置得更高(比如1)。但是这会把pH
线推到后面,使其不可见。所以,接下来关闭ax2
的帧,这样你就可以看到线了。然后打开ax2
的框架。这会给予你所需要的效果,并保持pH线在图例后面。现在,要合并两个图例,使用
get_legend_handles_labels()
获取图例句柄和标签,然后添加句柄和标签并创建一个合并的图例。更新后的代码如下所示。希望这对你有帮助...
输出图