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

