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基于Tkinter库实现简单文本编辑器实例
May 05 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
Django 配置多站点多域名的实现步骤
May 17 Python
python求最大值最小值方法总结
Jun 25 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
Python aiohttp百万并发极限测试实例分析
Oct 26 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
详解Python3中的 input() 函数
Mar 18 Python
python实现对变位词的判断方法
Apr 05 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
python音频处理的示例详解
Dec 23 Python
Python基本的内置数据类型及使用方法
Apr 13 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 xml实例 留言本
2009/03/20 PHP
CI框架中zip类应用示例
2014/06/17 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
Python open()文件处理使用介绍
2014/11/30 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
信息管理员岗位职责
2013/12/01 职场文书
同事打架检讨书
2014/02/04 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
毕业生学校组织意见
2015/06/04 职场文书
健康证明
2015/06/19 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
离婚民事起诉状
2015/08/03 职场文书
思想品德课教学反思
2016/02/24 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP