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
相关产品推荐
相关产品推荐

