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 时间操作例子和时间格式化参数小结
Apr 24 Python
python使用opencv进行人脸识别
Apr 07 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
用Python识别人脸,人种等各种信息
Jul 15 Python
Python二元赋值实用技巧解析
Oct 25 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
使用TFRecord存取多个数据案例
Feb 17 Python
python对XML文件的操作实现代码
Mar 27 Python
Pandas数据分析的一些常用小技巧
Feb 07 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
PHPMailer安装方法及简单实例
2008/11/25 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
Element Popover 弹出框的使用示例
2020/07/26 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
python调用摄像头显示图像的实例
2018/08/03 Python
python动态进度条的实现代码
2019/07/03 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
opencv python图像梯度实例详解
2020/02/04 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
领导党性分析材料
2014/02/15 职场文书
毕业生就业协议书
2014/04/11 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
污水处理保证书
2015/05/09 职场文书
山楂树之恋观后感
2015/06/11 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript