python matplotlib绘图实现删除重复冗余图例的操作

问题:

由于自己做项目的时候,需要循环的绘制数据,假设有100个样本,每个样本包含两个坐标点(A, B),我需要对这两个点标上不同的颜色,同时还要画出两点间的连线。

显然这个问题中图例我只需要3个(A点,B点,AB的连线),而不是300个,因为每个样本的A点都是同样的颜色,B点也都是一样的颜色,AB的连线也是。

但是单纯的在画完图之后用plt.legend(), 它会给你画出所有300个图例来,这肯定不是我想要的。

探索过程:

如何解决呢?

当然有一种很强制的方法,就是只在画第一个样本,或最后一个样本时,给其指定label,其它样本时不给label,就不会画出来了。

但是我在想有没有更好地办法,百度了半天,穷尽所有关键词,无果。

转而谷歌,想着要不把关键词换成英语看看(以前总觉得看英文的博客会比中文的慢很多,总会更偏向于母语阅读,但是这次经历大概会改变我之后的态度,相比起为了排除百度的大量无关答案所花的漫长的时间,好像还不如直接搜索英文来得有效率,关键词搜的就是: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())

理解:

plt的legend函数可接收两个参数,一个是handles列表,一个是label列表。

引入有序字典OrderedDict的目的就是去除冗余的图例,因为字典的键值不能重复(即重复的只保留一个)。

第一行的意思应该是迭代地将当前plt中存的所有handles和labels返回到handles变量和labels变量中,你之前所在画布上画的每一步应该都会存在plt中。

所以,上述代码的作用是:仅保留plt中存在的所有非同名的图例名称,不出现重复图例名称

补充:Python/matplotlib之清空绘图

clf() # 清图

cla() # 清坐标轴

close() # 关窗口

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 详解matplotlib中pyplot和面向对象两种绘图模式之间的关系

    matplotlib有两种绘图方式,一种是依托matplotlib.pyplot模块实现类似matlab绘图指令的绘图方式,一种是面向对象式绘图,依靠FigureCanvas(画布). Figure (图像). Axes (轴域) 等对象绘图. 这两种方式之间并不是完全独立的,而是通过某种机制进行了联结,pylot绘图模式其实隐式创建了面向对象模式的相关对象,其中的关键是matplotlib._pylab_helpers模块中的单例类Gcf,它的作用是追踪当前活动的画布及图像. 因此,可以说ma

  • python 绘图模块matplotlib的使用简介

    上周对线上某几个磁盘进行了fio硬盘性能测试,测试完成之后的结果需要绘制成图像展示出来.我在官网上查找了一下fio自带的命令fio_generate_plot和fio2gnuplot工具的用法,找到了图像的绘制方法,在某一个单一的场景下,确实可以使用这两个工具来进行硬盘性能图像绘制,但是问题是,如果要对比多个场景下绘制出来的图像的差异,fio自带的绘图工具实现起来就有些困难了,但是确实也能实现.例如下图: 如图所示为磁盘iodepth不变,numjobs在(1,8,16)三种不同的场景下绘制出来

  • Pyside2中嵌入Matplotlib的绘图的实现

    近期遇到一个需求,就是用PySide2做出一个GUI,并且要将后台使用Matplotlib绘制的图显示在界面上.自己琢磨了蛮久,网上也搜了不少资料,但都感觉参差不齐,所以就自己总结一下. 我们使用QGraphicsView插件来显示Matplotlib里绘制的图片.这里演示的功能为:打开时界面默认绘制 cos函数的图像,点击按钮后,绘制sin函数的图像. 1. 界面设计 简单创建一个界面:一个 GraphicsView 和 一个 PushButton 2. 定义一个类,继承FigureCanva

  • 解决使用Spyder IDE时matplotlib绘图的显示问题

    Spyder 环境下 matplotlib 的 backend 设置是在打开环境时就配置好了的 所以通常的方法: import matplotlib matplotlib.use('Qt5Agg') 是无效的. Spyder 下解决这个问题最简单的方法是 GUI 的方法: Tools -> Preferences -> IPython console -> Graphics -> Backend: Qt5 应用,然后可能需要重启一下,就可以了.如无特殊需要,以后无需更改. 补充:P

  • 详解matplotlib绘图样式(style)初探

    样式是定义图表可视化外观的配置,它由一组预置的rcParams参数构成.matplotlib预置了一系列样式风格,可直接使用. 样式使用方法 样式相关模块为style. 1. 显示本机可用样式 matplotlib.style.available返回本机可用样式的列表. 列表只读,样式更新后,需要使用reload_library()重新加载样式. In [1]: import matplotlib.style as style In [2]: style.available Out[2]: ['

  • 用Python的绘图库(matplotlib)绘制小波能量谱

    时间小波能量谱 反映信号的小波能量沿时间轴的分布. 由于小波变换具有等距效应,所以有: 式中 表示信号强度,对于式①在平移因子b方向上进行加权积分 式中 代表时间-小能量谱 尺度小波能量谱 反映信号的小波能量随尺度的变化情况. 同理,对式①在尺度方向上进行加权积分: 式中 连续小波变换 连续小波变换的结果是一个小波系数矩阵,随着尺度因子和位移因子变化.然后将系数平方后得到小波能量,把每个尺度因子对应的所有小波能量进行叠加,那么就可以得到随尺度因子变换的小波能量谱曲线.把尺度换算成频率后,这条曲线

  • python之 matplotlib和pandas绘图教程

    不得不说使用python库matplotlib绘图确实比较丑,但使用起来还算是比较方便,做自己的小小研究可以使用.这里记录一些统计作图方法,包括pandas作图和plt作图. 前提是先导入第三方库吧 import pandas as pd import matplotlib.pyplot as plt import numpy as np 然后以下这两句用于正常显示中文标签什么的. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

  • python matplotlib绘图实现删除重复冗余图例的操作

    问题: 由于自己做项目的时候,需要循环的绘制数据,假设有100个样本,每个样本包含两个坐标点(A, B),我需要对这两个点标上不同的颜色,同时还要画出两点间的连线. 显然这个问题中图例我只需要3个(A点,B点,AB的连线),而不是300个,因为每个样本的A点都是同样的颜色,B点也都是一样的颜色,AB的连线也是. 但是单纯的在画完图之后用plt.legend(), 它会给你画出所有300个图例来,这肯定不是我想要的. 探索过程: 如何解决呢? 当然有一种很强制的方法,就是只在画第一个样本,或最后一

  • Python matplotlib绘图设置图例案例

    目录 一.语法简介 二.完整代码 一.语法简介 plt.legend(loc=2,edgecolor='red',facecolor='green',shadow='True',fontsize=10) edgecolor 图例边框线颜色  facecolor 图例背景色 shadow 是否添加阴影  title 图例标题 fontsize 设置字体大小 ''' 设置图例位置loc参数简介 best         0  根据图标区域自动选择最合适的位置 upper right  1  右上角

  • Python matplotlib绘图时指定图像大小及放大图像详解

    matplotlib绘图时是默认的大小,有时候默认的大小会感觉图片里的内容都被压缩了,解决方法如下. 先是原始代码: from matplotlib import pyplot as plt plt.figure(figsize=(1,1)) x = [1,2,3] plt.plot(x, x) plt.show() 关键的代码是plt.figure(figsize=(1,1)),生成的图片如下 修改代码,放大图片: from matplotlib import pyplot as plt pl

  • Python Matplotlib绘图基础详细教程

    目录 1. 画图的基本步骤 1.1一步一步看 2.散点图 3.条形图的绘制 4.四幅子图的绘制 5.饼状图的绘制 6.热力图的绘制 总结 plt是最常用的接口 1. 画图的基本步骤 1.导入模块 import matplotlib as mpl import matplotlib.pyplot as plt 2.创建画板,然后对画板进行调整 3.定义数据 4.绘制图形(包含坐标轴的设置,数据的导入,线条的样式,颜色,还有标题,图例,等等) 5.plt.show() 1.1一步一步看 1.1.1*

  • python matplotlib绘图,修改坐标轴刻度为文字的实例

    工作中偶尔需要做客流分析,用pyplot 库绘图.一般情况下, x 轴刻度默认显示为数字. 例如: 我希望x 轴刻度显示为星期日期. 查询pyplot 文档, 发现了 xtick() 函数可以修改刻度. 代码如下: import matplotlib.pyplot as plt import numpy as np #val_ls = [np.random.randint(100) + i*20 for i in range(7)] scale_ls = range(7) index_ls =

  • 完美解决Python matplotlib绘图时汉字显示不正常的问题

    Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下: 1.在python安装目录的Lib目录下创建ch.py文件. 文件中代码为: 保存,以后通过以下代码调用: #-*-coding:utf-8-*- #文件名: ch.py def set_ch(): from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcParams['axes

  • python matplotlib 绘图 和 dpi对应关系详解

    我就废话不多说啦! dpi=1 600×400 dpi=2 1200×800 dpi=3 1800×1200 ........ dpi=21 (21×600)×(21×400) ---> 12600×8400 示例代码: ............... ............... plt_temp=y_axis plt_temp.resize(len(y_axis) , 1) plt_arr=np.concatenate((plt_arr,plt_temp ), axis=1) #print

  • 解决Python Matplotlib绘图数据点位置错乱问题

    在绘制正负样本在各个特征维度上的CDF(累积分布)图时出现了以下问题: 问题具体表现为: 1.几个负样本的数据点位置倒错 2.X轴刻度变成了乱七八糟一团鬼东西 最终解决办法 造成上述情况的原因其实是由于输入matplotlib.plot()函数的数据x_data和y_data从CSV文件中直接导入后格式为string,因此才会导致所有数据点的x坐标都被直接刻在了x轴上,且由于坐标数据格式错误,部分点也就表现为"乱点".解决办法就是导入x,y数据后先将其转化为float型数据,然后输入p

  • Python matplotlib绘图建立画布及坐标系

    目录 一.建立画布 二.用plt.subplot函数建立坐标系,并分别绘制折线图和柱状图 三.完整代码如下所示 四.对应效果图如下所示 一.建立画布 import matplotlib.pyplot as plt import numpy as np x=np.arange(8) y=np.arange(8) print(x,y) #建立画布 figsize,它用width和height来控制画布的宽和高 plt.figure(figsize=(8,6),dpi=90) #facecolor='

  • Python matplotlib绘图时使用鼠标滚轮放大/缩小图像

    目录 思路: 示例: 输出效果: 总结 思路: 使用fig.canvas.mpl_connect()函数来绑定相关fig的滚轮事件 利用事件event的inaxes属性获取当前鼠标所在坐标系ax 使用get_xlim()函数获取坐标系ax的x/y轴坐标刻度范围 使用set()函数对坐标系ax进行放大/缩小 示例: import matplotlib.pyplot as plt import numpy as np fig = plt.figure() def call_back(event):

随机推荐