You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib双轴绘图:如何避免pH线条覆盖图例或合并双图例

解决双轴图表的两个问题:线条层级与合并图例

一、把pH红色线条放到底层

twinx()创建的ax2默认在ax1上层,导致pH线条遮挡图例。可以通过两种方式调整层级:

方法1:单独设置线条层级

绘制pH线条时,给plot()方法添加zorder参数,设置为低于ax1线条的默认值(ax1线条默认zorder为2,设为0即可):

ax2.plot(t,pH,'r',label='pH', zorder=0)

方法2:调整整个轴的层级

如果要让ax2的所有内容都在ax1下方,可修改轴的zorder并设置背景透明:

ax2 = ax1.twinx()
# 将ax2层级设为ax1之下
ax2.set_zorder(ax1.get_zorder() - 1)
# 隐藏ax2背景,避免遮挡ax1内容
ax2.patch.set_visible(False)

二、合并两个轴的图例为一个

收集两个轴的图例元素(线条+标签),统一创建一个图例即可,修改后的完整代码如下:

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')

# 收集两个轴的图例元素
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
all_handles = handles1 + handles2
all_labels = labels1 + labels2

# 创建统一图例,位置可按需调整
ax1.legend(all_handles, all_labels, loc='upper center', mode='expand', ncol=5)

plt.show()

执行后会生成包含所有5个指标的统一图例,无需再分别调用两个轴的legend()方法。


内容的提问来源于stack exchange,提问作者Nacho G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:13:17