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

