matplotlib部件之套索Lasso的使用


Posted in Python onFebruary 24, 2021

套索概述

套索(Lasso)是与套索选区(LassoSelector)相似的matplotlib部件(widgets),两者的区别主要在于:

继承关系:

  • 套索具体实现定义为matplotlib.widgets.Lasso类,继承关系为:Widget->AxesWidget->Lasso。
  • 套索选区具体实现定义为matplotlib.widgets.LassoSelector类,继承关系为:Widget->AxesWidget->_SelectorWidget->LassoSelector。

构造参数:

  • Lasso类的签名为class matplotlib.widgets.Lasso(ax, xy, callback=None, useblit=True),Lasso类需要给定套索一个起始的坐标。
  • LassoSelector类的签名为class matplotlib.widgets.LassoSelector(ax, onselect=None, useblit=True, lineprops=None, button=None)。

事件处理:

  • Lasso事件在鼠标释放时即被销毁。
  • LassoSelector在鼠标释放时仍然可以继续与子图交互,直到断开与子图的连接。

Lasso类构造函数的参数为:

  • ax:套索生效的子图,类型为matplotlib.axes.Axes的实例。
  • xy:套索起始的坐标。
  • callback:套索完成即鼠标释放时执行的回调函数,函数签名为def func(verts),verts的为套索端点的坐标列表。

套索可以使用matplotlib.path.Path类的contains_point方法获取选区内的数据点。
貌似 Lasso是实验性API,还不够完善,matplotlib 3.3之后可能逐步废弃 Lasso。

案例: 

官方案例,https://matplotlib.org/3.2.1/gallery/event_handling/lasso_demo.html

案例说明

matplotlib部件之套索Lasso的使用

案例代码

from matplotlib import colors as mcolors, path
from matplotlib.collections import RegularPolyCollection
import matplotlib.pyplot as plt
from matplotlib.widgets import Lasso
import numpy as np


class Datum:
  colorin = mcolors.to_rgba("red")
  colorout = mcolors.to_rgba("blue")

  def __init__(self, x, y, include=False):
    self.x = x
    self.y = y
    if include:
      self.color = self.colorin
    else:
      self.color = self.colorout


class LassoManager:
  def __init__(self, ax, data):
    self.axes = ax
    self.canvas = ax.figure.canvas
    self.data = data

    self.Nxy = len(data)

    facecolors = [d.color for d in data]
    self.xys = [(d.x, d.y) for d in data]
    self.collection = RegularPolyCollection(
      6, sizes=(100,),
      facecolors=facecolors,
      offsets=self.xys,
      transOffset=ax.transData)

    ax.add_collection(self.collection)

    self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)

  def callback(self, verts):
    facecolors = self.collection.get_facecolors()
    p = path.Path(verts)
    ind = p.contains_points(self.xys)
    for i in range(len(self.xys)):
      if ind[i]:
        facecolors[i] = Datum.colorin
      else:
        facecolors[i] = Datum.colorout

    self.canvas.draw_idle()
    self.canvas.widgetlock.release(self.lasso)
    del self.lasso

  def onpress(self, event):
    if self.canvas.widgetlock.locked():
      return
    if event.inaxes is None:
      return
    self.lasso = Lasso(event.inaxes,
              (event.xdata, event.ydata),
              self.callback)
    # acquire a lock on the widget drawing
    self.canvas.widgetlock(self.lasso)


if __name__ == '__main__':

  np.random.seed(19680801)

  data = [Datum(*xy) for xy in np.random.rand(100, 2)]
  ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
  ax.set_title('Lasso points using left mouse button')

  lman = LassoManager(ax, data)

  plt.show()

代码分析

案例的关键代码在于LassoManager类的onpress方法和callback方法。由于Lasso类在事件处理上比较原始,需要用户进行控制,在鼠标按下、释放事件中需要使用canvas.widgetlock对象锁定/解锁绘图功能,保证只有一个对象进行绘图,canvas.widgetlock是matplotlib.widgets.LockDraw类的实例。

总结

尽量使用套索选区(LassoSelector)而不是套索(Lasso),两者功能相似,索选区(LassoSelector)使用相对更简单一些,套索(Lasso)还有一些BUG,matplotlib 3.3已不再推荐使用。

到此这篇关于matplotlib部件之套索Lasso的使用的文章就介绍到这了,更多相关matplotlib 套索内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
总结python爬虫抓站的实用技巧
Aug 09 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
简单了解Python3里的一些新特性
Jul 13 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
Python sorted排序方法如何实现
Mar 31 Python
scrapy头部修改的方法详解
Dec 06 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 #Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 #Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 #Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 #Python
pandas map(),apply(),applymap()区别解析
Feb 24 #Python
Python的Tqdm模块实现进度条配置
Feb 24 #Python
详解pandas apply 并行处理的几种方法
Feb 24 #Python
You might like
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
探究Python中isalnum()方法的使用
2015/05/18 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
森林防火工作方案
2014/02/14 职场文书
逃课上网检讨书
2014/02/20 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
鉴定评语大全
2014/05/05 职场文书
企业安全生产标语
2014/06/06 职场文书
反腐倡廉观后感
2015/06/08 职场文书
毕业欢送会致辞
2015/07/29 职场文书
员工手册董事长致辞
2015/07/29 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python