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/ironpython:从入门到精通
Oct 02 Python
Python实现把数字转换成中文
Jun 29 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
用python与文件进行交互的方法
Mar 01 Python
Python箱型图处理离群点的例子
Dec 09 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
Python restful框架接口开发实现
Apr 13 Python
Django models文件模型变更错误解决
May 11 Python
python中get和post有什么区别
Jun 19 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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
网站当前的在线人数
2006/10/09 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JS的get和set使用示例
2014/02/20 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python下载文件时显示下载进度的方法
2015/04/02 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
详解python基础之while循环及if判断
2017/08/24 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
六一亲子活动总结
2014/07/01 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS