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中的下划线详解
Jun 24 Python
python简单读取大文件的方法
Jul 01 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
python基础教程项目三之万能的XML
Apr 02 Python
python 寻找离散序列极值点的方法
Jul 10 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
Python龙贝格法求积分实例
Feb 29 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
Python用Jira库来操作Jira
Dec 28 Python
python实现控制台输出颜色
Mar 02 Python
python pygame入门教程
Jun 01 Python
python使用BeautifulSoup 解析HTML
Apr 24 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接口中interface存在的意义
2013/06/27 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
深入理解Promise.all
2018/08/08 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python简单贪吃蛇开发
2019/01/28 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
通俗讲解python 装饰器
2020/09/07 Python
python中封包建立过程实例
2021/02/18 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
会计岗位职责
2013/11/08 职场文书
实习生自我评价
2014/01/18 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
交警失职检讨书
2015/01/26 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android