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

Pandas绘图更新图例标签后仍获取旧标签的问题排查

问题:Matplotlib更新图例后,get_legend_handles_labels()返回旧标签

请参考以下代码:

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

# Create dataframe
data = np.random.rand(10, 2)
cols = pd.MultiIndex.from_tuples(
    [("a", "b"), ("c", "d")], names=["lev1", "lev2"]
)
df = pd.DataFrame(data=data, columns=cols)

# Create a figure and plot the dataframe
fig, axes = plt.subplots(1, 1)
df.plot(ax=axes)

# Update the legend
h, l = axes.get_legend_handles_labels()
print(l)
new_labels = ["this", "that"]
axes.legend(h, new_labels)

# Get the current legend
h, ll = axes.get_legend_handles_labels()
print(ll)

我预期ll==new_labels,但实际得到的是ll==l,不过绘图中显示的图例确实是new_labels。

为什么无法得到预期结果(即ll==new_labels)?我哪里操作有误?


原因分析

axes.get_legend_handles_labels()并非从当前显示的图例中读取标签,而是直接读取轴上绘图对象(如折线、柱状图元素)自身的label属性值。

当你用df.plot()绘图时,pandas已经为每个线条设置了原始标签(即第一次打印的l)。后续调用axes.legend(h, new_labels)只是覆盖了图例的显示文本,但没有修改这些绘图对象本身的label属性。因此再次调用get_legend_handles_labels()时,依然会返回原始标签。

解决方法

方法1:直接从图例对象读取显示标签

如果要获取当前图例实际显示的标签,需要从图例对象中提取:

# 更新图例后获取图例对象
legend = axes.get_legend()
# 提取所有图例文本
current_labels = [text.get_text() for text in legend.get_texts()]
print(current_labels)  # 输出: ["this", "that"]

如果需要同时获取手柄和对应显示标签:

handles = legend.legendHandles
labels = [text.get_text() for text in legend.texts]

方法2:修改绘图对象的label属性(让get_legend_handles_labels()返回新标签)

如果希望后续调用get_legend_handles_labels()能返回新标签,可以在更新图例前修改绘图对象的label属性:

h, l = axes.get_legend_handles_labels()
new_labels = ["this", "that"]
# 逐个修改线条的label属性
for handle, label in zip(h, new_labels):
    handle.set_label(label)
# 重新生成图例
axes.legend()
# 此时调用get_legend_handles_labels()会返回新标签
h, ll = axes.get_legend_handles_labels()
print(ll)  # 输出: ["this", "that"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:35:17