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中的25个隐藏特性
Mar 30 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
利用aardio给python编写图形界面
Aug 21 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
目前最全的python的就业方向
Jun 05 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
python带参数打包exe及调用方式
Dec 21 Python
Python实现钉钉订阅消息功能
Jan 14 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
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
帝国cms目录结构分享
2015/07/06 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
js点击选择文本的方法
2015/02/09 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
Python检测生僻字的实现方法
2016/10/23 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
枚举与#define宏的区别
2014/04/30 面试题
什么是.net的Remoting技术
2016/07/08 面试题
车贷收入证明范本
2014/01/09 职场文书
直接有效的自我评价
2014/01/11 职场文书
个人投资合作协议书
2014/10/12 职场文书
出差报告怎么写
2014/11/06 职场文书
小学生成绩单评语
2014/12/31 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python