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

Matplotlib绘制DataFrame时如何无需额外调用添加自定义图例?

嘿,这个问题我之前也遇到过,刚好有几个实用的解决方案,帮你实现用pandas DataFrame绘图时自定义标签,还不用手动调用ax.legend():

方案1:重命名DataFrame的列(最推荐)

pandas的df.plot()默认会用DataFrame的列名作为图例标签,而且会自动生成图例,不需要手动调用legend()。所以最简单的方法就是把列名改成你想要的自定义标签:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的原始数据(单列DataFrame)
df = pd.DataFrame({'Value': [1.05, 1.06, 1.04, 1.03, 1.07]}, 
                  index=pd.date_range('2024-01-01', periods=5))
# 计算3日移动平均线
rolling_mean = df.rolling(window=3).mean()

# 重命名列,设置自定义标签
df_renamed = df.rename(columns={'Value': 'FRED/DEXUSEU'})
rolling_mean_renamed = rolling_mean.rename(columns={'Value': '3-day SMA'})

# 绘图:自动用列名作为标签,自动显示图例
fig, ax = plt.subplots()
df_renamed.plot(ax=ax, linewidth=1)
rolling_mean_renamed.plot(ax=ax, linewidth=1)

plt.show()

这样运行后,图例会自动显示,标签就是你设置的列名,完全不需要手动调用ax.legend()。

方案2:使用Series.plot()传递label参数

如果不想修改原始DataFrame的列名,可以把单列DataFrame转换成Series,然后用Series.plot()的label参数设置自定义标签。不过这里要注意:虽然label参数生效了,但pandas不会自动帮你调用legend(),不过你可以在最后用ax.legend()一次性设置,代码依然很简洁:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'Value': [1.05, 1.06, 1.04, 1.03, 1.07]}, 
                  index=pd.date_range('2024-01-01', periods=5))
rolling_mean = df.rolling(window=3).mean()

fig, ax = plt.subplots()
# 转换成Series,传递label参数
df['Value'].plot(ax=ax, linewidth=1, label='FRED/DEXUSEU')
rolling_mean['Value'].plot(ax=ax, linewidth=1, label='3-day SMA')

# 只需要一次调用legend,不用手动传标签
ax.legend()

plt.show()

为什么你之前的df.plot(label=...)无效?

这里要解释下:pandas的DataFrame.plot()的label参数并不是用来设置单列表格的折线标签的——这个参数主要用于绘制多列汇总图(比如箱线图、直方图)时的整体标签,对于单列的折线图,它会优先使用列名作为图例标签,所以你传递的label参数会被忽略。而Series.plot()因为只有一列,所以label参数会直接生效。

总结一下,如果你想完全不用手动调用legend(),**方案1(重命名列)**是最直接的选择;如果不想修改数据,方案2也能满足需求,只需要一次简单的legend()调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:53