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

如何解决for循环内调用matplotlib绘图导致图例出现多个重复标签的问题

matplotlib循环绘图图例重复标签修复方案

问题说明

现有循环绘制散点的代码如下:

for xe, ye in zip(x, y):
    plt.scatter([xe] * len(ye), ye,color='green',edgecolor='black',zorder=2,label='OK')

代码运行时每次for循环迭代都会生成一次'OK'标签,最终图例出现大量重复条目,异常效果如下:
重复图例效果示意图
需求为图例中仅展示单个"OK"标签而非多个重复标签。

可行解决方法

以下三种方法均可实现需求,可根据自己的代码场景选择:

  • 方法一:仅首次迭代设置标签
    直接修改循环逻辑,仅在第一次循环时传入label参数,后续循环将标签设为空值,从生成源头避免重复标签:
    for idx, (xe, ye) in enumerate(zip(x, y)):
        # 仅第一次绘制时设置标签
        current_label = 'OK' if idx == 0 else ""
        plt.scatter([xe] * len(ye), ye, color='green', edgecolor='black', zorder=2, label=current_label)
    
  • 方法二:绘图后对图例自动去重
    不需要改动原有循环绘图逻辑,所有绘制完成后提取当前坐标轴的图例句柄与标签,通过字典去重后重新生成图例即可:
    # 原有循环代码保持不变
    for xe, ye in zip(x, y):
        plt.scatter([xe] * len(ye), ye,color='green',edgecolor='black',zorder=2,label='OK')
    
    # 新增图例去重逻辑
    handles, labels = plt.gca().get_legend_handles_labels()
    unique_legends = dict(zip(labels, handles))
    plt.legend(unique_legends.values(), unique_legends.keys())
    
  • 方法三:合并全量数据后单次绘制
    提前将所有散点的x、y坐标拼接为完整列表,仅调用一次scatter方法完成绘制,从根源上不会生成重复标签,同时绘图效率高于循环多次调用:
    all_x, all_y = [], []
    for xe, ye in zip(x, y):
        all_x.extend([xe] * len(ye))
        all_y.extend(ye)
    # 单次绘制全量散点
    plt.scatter(all_x, all_y, color='green', edgecolor='black', zorder=2, label='OK')
    

注意:如果后续需要给不同分组的散点设置不同的颜色、大小等样式,优先选择前两种方法;如果所有散点样式完全统一,方法三的运行效率最优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:39:18