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 中使用 GLOBAL引发的一系列问题
Oct 12 Python
Python实现的简单dns查询功能示例
May 24 Python
python实现上传下载文件功能
Nov 19 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python3+requests接口自动化session操作方法
Oct 13 Python
Python判断telnet通不通的实例
Jan 26 Python
使用python实现回文数的四种方法小结
Nov 24 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
使用Tkinter制作信息提示框
Feb 18 Python
Python如何急速下载第三方库详解
Nov 02 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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答题类应用接口实例
2015/02/09 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
实例讲解PHP表单处理
2019/02/15 PHP
javascript void(0)的妙用
2009/10/21 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
python写日志封装类实例
2015/06/28 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
python标记语句块使用方法总结
2019/08/05 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
python字符串的index和find的区别详解
2020/06/20 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
2015年个人现实表现材料
2014/12/10 职场文书
安阳殷墟导游词
2015/02/10 职场文书
道歉信怎么写
2015/05/12 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang