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通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python中的进程分支fork和exec详解
Apr 11 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
解决python opencv无法显示图片的问题
Oct 28 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
Python实现微信翻译机器人的方法
Aug 13 Python
jupyter notebook 多行输出实例
Apr 09 Python
python实现学生成绩测评系统
Jun 22 Python
Pycharm连接gitlab实现过程图解
Sep 01 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 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
PHP程序员编程注意事项
2008/04/10 PHP
重新认识php array_merge函数
2014/08/31 PHP
Laravel框架表单验证详解
2014/09/04 PHP
Laravel实现表单提交
2017/05/07 PHP
在视频前插入广告
2006/11/20 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
JS常用知识点整理
2017/01/21 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
Python的设计模式编程入门指南
2015/04/02 Python
python遍历数组的方法小结
2015/04/30 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
flask session组件的使用示例
2018/12/25 Python
python画微信表情符的实例代码
2019/10/09 Python
Python定义一个函数的方法
2020/06/15 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
HTML5的语法变化介绍
2013/08/13 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
母校寄语大全
2014/04/10 职场文书
拉歌口号大全
2014/06/13 职场文书
2019军训心得体会
2019/06/27 职场文书
详解PyTorch模型保存与加载
2022/04/28 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript