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

将图例移至绘图区域外时丢失第二个系列的解决方法

解决Pandas双Y轴绘图移动图例丢失系列项的问题

你遇到的这个情况其实挺典型的——当用Pandas绘制带次Y轴的双系列图表时,直接调用主轴的legend()方法只会处理主轴上的系列,次Y轴的系列不会被包含进去,所以移动图例就会丢失第二个标签。这里有两个简便的解决办法:

方法一:合并两个轴的图例元素

我们可以分别获取主、次Y轴上的线条和标签,合并后再创建完整的图例:

import pandas as pd
import numpy as np

x = np.arange(0,100,1)
y1 = x
y2 = x**2
tempDF = pd.DataFrame({'y1': y1, 'y2': y2}, index=x)

# 绘制主Y轴系列,获取主轴对象
ax = tempDF.plot(y='y1')
# 绘制次Y轴系列,获取次轴对象
ax2 = tempDF.plot(y='y2', ax=ax, secondary_y=True)

# 分别获取两个轴的图例线条和标签
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()

# 合并后创建图例,指定位置
ax.legend(lines + lines2, labels + labels2, loc=(1.15,.9))

原理很简单:次Y轴的y2系列是属于ax2这个独立的轴对象的,主ax默认不会管它的图例,所以我们需要手动把两个轴的图例元素整合到一起。

方法二:直接用matplotlib的全局legend

如果你导入了matplotlib.pyplot,可以直接调用plt.legend(),它会自动收集当前所有轴上的可见系列,一步到位:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,100,1)
y1 = x
y2 = x**2
tempDF = pd.DataFrame({'y1': y1, 'y2': y2}, index=x)

ax = tempDF.plot(y='y1')
tempDF.plot(y='y2', ax=ax, secondary_y=True)

# 直接创建包含所有系列的图例
plt.legend(loc=(1.15,.9))

这种方法更简洁,适合快速解决问题。

为什么原来的ax.legend()会失效?因为ax是主Y轴的轴对象,它只负责管理自己上面绘制的y1系列,次Y轴的系列属于另一个独立的轴(你也可以通过ax.right_ax访问到它),所以单独调用主轴的legend()只会显示主轴的系列标签。

内容的提问来源于stack exchange,提问作者m.j.har

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:57