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连接mysql并提交mysql事务示例
Mar 05 Python
整理Python中的赋值运算符
May 13 Python
快速查询Python文档方法分享
Dec 27 Python
详解Python中where()函数的用法
Mar 27 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
pytorch+lstm实现的pos示例
Jan 14 Python
Python 如何反方向迭代一个序列
Jul 28 Python
python 爬虫如何实现百度翻译
Nov 16 Python
Python析构函数__del__定义原理解析
Nov 20 Python
Python Pygame实现俄罗斯方块
Feb 19 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生成HTML静态页面实例代码
2008/08/31 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
python右对齐的实例方法
2020/07/05 Python
大学生简单自荐信
2013/11/10 职场文书
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
2014年村官工作总结
2014/11/24 职场文书
《正比例》教学反思
2016/02/23 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python