Matplotlib图表图例标签替换求助:基于DataFrame列值修改
解决Matplotlib图例替换为DataFrame中name列值的问题
我太懂你这种改图例改到崩溃的感觉了——用DataFrame.plot()的时候,默认图例是列名,但你要的是对应行的name列值,对吧?咱们一步步把这个问题解决掉。
先分析你之前的错误原因
- 设置label参数的错误:你写了
.label=targets,这是语法错误,正确参数是labels=;而且你用了整个df['name']列,但实际只需要你选中的5行(3000到3004行,因为iloc是左闭右开)对应的name值,数量不匹配也会导致失效。 - 循环绘图的错误:你遇到的维度不匹配、索引错误,大概率是因为循环时没正确提取每行的数值数据和对应的name标签,比如把行和列的转置关系搞混了,或者选中了非数值列来绘图。
正确的解决方案
先提前准备好要绘图的子集和对应的标签:
import matplotlib.pyplot as plt # 1. 提取你要绘图的5行数值列数据 plot_subset = df.iloc[3000:3005, :].loc[:, float_cols] # 2. 获取这5行对应的name标签(从原DataFrame中提取对应行) target_labels = df.iloc[3000:3005]['name'].tolist()
方法1:直接在plot()中指定labels参数
这是最简洁的方式,直接告诉绘图函数要用的标签:
plt.figure(figsize=(10,6)) # 转置后绘图,传入labels参数 plot_subset.T.plot(labels=target_labels, ax=plt.gca()) plt.title('title', size=20) plt.ylabel('Y', size=14) plt.xlabel('x', size=14) plt.legend() # 确保图例显示 plt.show()
方法2:手动修改已绘图例
如果第一种方法不生效,你可以先绘图,再手动替换图例标签,灵活性更高:
plt.figure(figsize=(10,6)) # 先完成绘图,获取轴对象 ax = plot_subset.T.plot() # 获取当前图例的手柄和原有标签 handles, _ = ax.get_legend_handles_labels() # 用新标签替换旧标签 ax.legend(handles, target_labels) plt.title('title', size=20) plt.ylabel('Y', size=14) plt.xlabel('x', size=14) plt.show()
方法3:循环逐行绘制(最可控)
如果你想完全掌控每一条线的绘制细节,循环逐行画是最稳妥的,也能避免DataFrame.plot()的自动处理问题:
plt.figure(figsize=(10,6)) ax = plt.gca() # 获取当前轴对象 # 遍历选中的每一行数据 for idx, row in plot_subset.iterrows(): # 获取当前行对应的name标签 current_label = df.loc[idx, 'name'] # 绘制当前行的数值数据,指定标签 row.plot(ax=ax, label=current_label) plt.title('title', size=20) plt.ylabel('Y', size=14) plt.xlabel('x', size=14) plt.legend() plt.show()
这三种方法都能实现你的需求,选哪个看你习惯~我自己平时更常用方法2,因为有时候绘图后还要调整其他样式,手动改图例很方便。
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

