如何同时移除Matplotlib图例重复项并将图例移至图表外部?
解决Matplotlib图例去重并移至图表外部的问题
你的问题出在两次调用图例设置方法,后一次会完全覆盖前一次的配置:
- 先调用去重函数再用
plt.legend(...),后者会重新生成包含重复项的图例,覆盖去重结果 - 先调用
plt.legend(...)再用去重函数,去重函数会重新生成默认位置的图例,覆盖外部位置设置
要同时实现两个需求,必须把去重逻辑和位置配置合并到一次图例调用中,以下是两种可行方案:
方案1:直接在主函数中合并逻辑
def func(): # 你的绘图代码... # 获取所有图例的手柄和标签 handles, labels = ax.get_legend_handles_labels() # 筛选唯一的图例项(去重) unique_handles = [] unique_labels = [] for h, l in zip(handles, labels): if l not in unique_labels: unique_labels.append(l) unique_handles.append(h) # 一次性设置去重后的图例,并指定外部位置 ax.legend(handles=unique_handles, labels=unique_labels, loc='center left', bbox_to_anchor=(1, 0.5))
方案2:封装成统一的工具函数
把去重和位置配置整合到一个函数里,方便复用:
def set_unique_legend(ax, loc='center left', bbox_to_anchor=(1, 0.5)): handles, labels = ax.get_legend_handles_labels() # 去重逻辑 unique = [(h, l) for i, (h, l) in enumerate(zip(handles, labels)) if l not in labels[:i]] # 同时传入去重后的参数和位置配置 ax.legend(*zip(*unique), loc=loc, bbox_to_anchor=bbox_to_anchor) def func(): # 你的绘图代码... # 调用整合后的函数,同时实现去重+外部图例 set_unique_legend(ax)
注意事项
尽量统一使用轴对象ax的legend方法,避免混用plt.legend(全局图例)和ax.legend(局部轴图例),防止出现配置冲突。
内容的提问来源于stack exchange,提问作者DialFrost
相关产品推荐
相关产品推荐

