如何解决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
相关产品推荐
相关产品推荐

