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使用MD5加密字符串示例
Aug 22 Python
Python fileinput模块使用介绍
Nov 30 Python
Python简单获取自身外网IP的方法
Sep 18 Python
详谈Python基础之内置函数和递归
Jun 21 Python
python基础教程项目四之新闻聚合
Apr 02 Python
windows下添加Python环境变量的方法汇总
May 14 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
python字典的遍历3种方法详解
Aug 10 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
Python修改DBF文件指定列
Dec 19 Python
python xlsxwriter模块的使用
Dec 24 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 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入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
JS制作简易计算器的实例代码
2020/07/04 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python妹子图简单爬虫实例
2015/07/07 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python3实现表白神器
2019/04/09 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
2014年护士长工作总结
2014/11/11 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python