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实现ping的方法
Jul 06 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 Python
python实现控制COM口的示例
Jul 03 Python
python 子类调用父类的构造函数实例
Mar 12 Python
Python extract及contains方法代码实例
Sep 11 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Python中glob库实现文件名的匹配
Jun 18 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Python可变参数函数用法实例
2015/07/07 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Scrapy的简单使用教程
2017/10/24 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
django 修改server端口号的方法
2018/05/14 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
numpy数组广播的机制
2019/07/12 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
Django 重写用户模型的实现
2019/07/29 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
班长自荐书范文
2014/02/11 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
会计专业自荐信范文
2015/03/05 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers