Python matplotlib绘图实现删除重复冗余图例的操作
本文介绍在Python中使用matplotlib循环绘制大量数据时,如何避免生成冗余图例。通过获取当前图句柄和标签,利用OrderedDict去除重复项,仅保留唯一标识的图例。同时附带清空绘图、坐标轴及关闭窗口的常用命令,帮助提升图表清晰度与代码效率。
问题描述:
在个人项目开发过程中,经常需要循环绘制数据。例如,假设有100个样本,每个样本包含两个坐标点(A和B)。我们需要为这两个点标记不同的颜色,并绘制两点之间的连线。
在此场景下,图例仅需展示3项:A点、B点以及AB连线。由于所有样本中的A点颜色一致,B点颜色一致,连线样式也相同,因此不需要生成300个图例,而是希望合并为统一的3个图例。
然而,如果在绘图完成后直接调用plt.legend(),系统会生成全部300个图例,这显然不符合预期需求。
探索过程:
针对上述问题,寻求解决方案。
一种较为直接的方法是:仅在绘制第一个或最后一个样本时指定label参数,其余样本不指定label。这样生成的图例中,未指定label的项不会显示,从而避免冗余。
但我希望寻找更优雅的方法。经过百度多次尝试,使用各种关键词搜索,均未找到理想答案。
随后转向Google搜索,尝试将关键词替换为英文(以往认为阅读英文博客效率较低,更倾向母语阅读,但此次经历可能改变这一观点。相比花费大量时间筛选百度的无关结果,直接搜索英文往往更高效)。使用的关键词为“python omit redundant legend”,第一条搜索结果即提供了所需方案,令人惊喜。出于方便日后查找及帮助遇到相同问题者的目的,特此记录。虽然技术含量不高,但具有实用价值。
解决方案:
from collections import OrderedDict import matplotlib.pyplot as plt handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys())
原理说明:
matplotlib的legend函数接收两个参数:handles(图句柄列表)和labels(标签列表)。
引入OrderedDict(有序字典)的目的是去除冗余图例。由于字典的键(key)不能重复,重复的键值对只保留一个,从而实现去重。
代码第一行的作用是迭代获取当前plt中存储的所有handles和labels,并将其分别赋值给handles变量和labels变量。此前在画布上绘制的每一步操作,其句柄和标签均保存在plt中。
因此,上述代码的核心作用是:仅保留plt中存在的所有非同名图例标签,自动过滤掉重复的图例名称。
补充知识:Python/matplotlib中清空绘图的相关操作
clf() # 清空图形窗口
cla() # 清空坐标轴
close() # 关闭窗口
以上为个人经验分享,希望能提供参考。欢迎大家支持本站。如有错误或考虑不周之处,敬请指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













