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

如何同时移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:33:30