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爬虫之爬虫编写全记录
Nov 06 Python
最基础的Python的socket编程入门教程
Apr 23 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
用Python远程登陆服务器的步骤
Apr 16 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音乐采集(部分代码)
2007/02/14 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
JavaScript 原型与继承说明
2010/06/09 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
JQuery datepicker 用法详解
2015/12/25 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
跟老齐学Python之数据类型总结
2014/09/24 Python
python实现删除文件与目录的方法
2014/11/10 Python
Python实现选择排序
2017/06/04 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
python右对齐的实例方法
2020/07/05 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
Python类的继承super相关原理解析
2020/10/22 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
历史专业学生的自我评价
2014/02/28 职场文书
怎样写好工作计划
2019/04/10 职场文书