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

Matplotlib图表图例标签替换求助:基于DataFrame列值修改

解决Matplotlib图例替换为DataFrame中name列值的问题

我太懂你这种改图例改到崩溃的感觉了——用DataFrame.plot()的时候,默认图例是列名,但你要的是对应行的name列值,对吧?咱们一步步把这个问题解决掉。

先分析你之前的错误原因

  1. 设置label参数的错误:你写了.label=targets,这是语法错误,正确参数是labels=;而且你用了整个df['name']列,但实际只需要你选中的5行(3000到3004行,因为iloc是左闭右开)对应的name值,数量不匹配也会导致失效。
  2. 循环绘图的错误:你遇到的维度不匹配、索引错误,大概率是因为循环时没正确提取每行的数值数据和对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:32:44