matplotlib之多边形选区(PolygonSelector)的使用


Posted in Python onFebruary 24, 2021

多边形选区概述

多边形选区是一种常见的对象选择方式,在一个子图中,单击鼠标左键即构建一个多边形的端点,最后一个端点与第一个端点重合即完成多边形选区,选区即为多个端点构成的多边形。在matplotlib中的多边形选区属于部件(widgets),matplotlib中的部件都是中性(neutral )的,即与具体后端实现无关。

多边形选区具体实现定义为matplotlib.widgets.PolygonSelector类,继承关系为:Widget->AxesWidget->_SelectorWidget->PolygonSelector。

PolygonSelector类的签名为class matplotlib.widgets.PolygonSelector(ax, onselect, useblit=False, lineprops=None, markerprops=None, vertex_select_radius=15)

PolygonSelector类构造函数的参数为:

  • ax:多边形选区生效的子图,类型为matplotlib.axes.Axes的实例。
  • onselect:多边形选区完成后执行的回调函数,函数签名为def onselect( vertices),vertices数据类型为列表,列表元素格式为(xdata,ydata)元组。
  • drawtype:多边形选区的外观,取值范围为{"box", "line", "none"},"box"为多边形框,"line"为多边形选区对角线,"none"无外观,类型为字符串,默认值为"box"。
  • lineprops:多边形选区线条的属性,默认值为dict(color='k', linestyle='-', linewidth=2, alpha=0.5)。
  • markerprops:多边形选区端点的属性,默认值为dict(marker='o', markersize=7, mec='k', mfc='k', alpha=0.5)。
  • vertex_select_radius:多边形端点的选择半径,浮点数,默认值为15,用于端点选择或者多边形闭合。

PolygonSelector类中的state_modifier_keys公有变量 state_modifier_keys定义了操作快捷键,类型为字典。

  • “move_all”: 移动已存在的选区,默认为"shift"。
  • “clear”:清除现有选区,默认为 "escape",即esc键。
  • “move_vertex”:正方形选区,默认为"control"。

PolygonSelector类中的verts特性返回多边形选区中的多有端点,类型为列表,元素为(x,y)元组,即端点的坐标元组。

案例

官方案例,https://matplotlib.org/gallery/widgets/polygon_selector_demo.html

案例说明

matplotlib之多边形选区(PolygonSelector)的使用

单击鼠标左键创建端点,最终点击初始端点闭合多边形,形成多边形选区。选区外的数据元素颜色变淡,选区内数据颜色保持不变。

按esc键取消选区。按shift键鼠标可以移动多边形选区位置,按ctrl键鼠标可以移动多边形选区某个端点的位置。退出程序时,控制台输出选区内数据元素的坐标。

控制台输出:

Selected points:
[[2.0 2.0]
 [1.0 3.0]
 [2.0 3.0]]

案例代码

import numpy as np

from matplotlib.widgets import PolygonSelector
from matplotlib.path import Path


class SelectFromCollection:
  """
  Select indices from a matplotlib collection using `PolygonSelector`.

  Selected indices are saved in the `ind` attribute. This tool fades out the
  points that are not part of the selection (i.e., reduces their alpha
  values). If your collection has alpha < 1, this tool will permanently
  alter the alpha values.

  Note that this tool selects collection objects based on their *origins*
  (i.e., `offsets`).

  Parameters
  ----------
  ax : `~matplotlib.axes.Axes`
    Axes to interact with.
  collection : `matplotlib.collections.Collection` subclass
    Collection you want to select from.
  alpha_other : 0 <= float <= 1
    To highlight a selection, this tool sets all selected points to an
    alpha value of 1 and non-selected points to *alpha_other*.
  """

  def __init__(self, ax, collection, alpha_other=0.3):
    self.canvas = ax.figure.canvas
    self.collection = collection
    self.alpha_other = alpha_other

    self.xys = collection.get_offsets()
    self.Npts = len(self.xys)

    # Ensure that we have separate colors for each object
    self.fc = collection.get_facecolors()
    if len(self.fc) == 0:
      raise ValueError('Collection must have a facecolor')
    elif len(self.fc) == 1:
      self.fc = np.tile(self.fc, (self.Npts, 1))

    self.poly = PolygonSelector(ax, self.onselect)
    self.ind = []

  def onselect(self, verts):
    path = Path(verts)
    self.ind = np.nonzero(path.contains_points(self.xys))[0]
    self.fc[:, -1] = self.alpha_other
    self.fc[self.ind, -1] = 1
    self.collection.set_facecolors(self.fc)
    self.canvas.draw_idle()

  def disconnect(self):
    self.poly.disconnect_events()
    self.fc[:, -1] = 1
    self.collection.set_facecolors(self.fc)
    self.canvas.draw_idle()


if __name__ == '__main__':
  import matplotlib.pyplot as plt

  fig, ax = plt.subplots()
  grid_size = 5
  grid_x = np.tile(np.arange(grid_size), grid_size)
  grid_y = np.repeat(np.arange(grid_size), grid_size)
  pts = ax.scatter(grid_x, grid_y)

  selector = SelectFromCollection(ax, pts)

  print("Select points in the figure by enclosing them within a polygon.")
  print("Press the 'esc' key to start a new polygon.")
  print("Try holding the 'shift' key to move all of the vertices.")
  print("Try holding the 'ctrl' key to move a single vertex.")

  plt.show()

  selector.disconnect()

  # After figure is closed print the coordinates of the selected points
  print('\nSelected points:')
  print(selector.xys[selector.ind])

到此这篇关于matplotlib之多边形选区(PolygonSelector)的使用的文章就介绍到这了,更多相关matplotlib 多边形选区内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
在pycharm中设置显示行数的方法
Jan 16 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
python 直接赋值和copy的区别详解
Aug 07 Python
使用python3 实现插入数据到mysql
Mar 02 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
详解如何用Python实现感知器算法
Jun 18 Python
Pandas 数据编码的十种方法
Apr 20 Python
matplotlib部件之套索Lasso的使用
Feb 24 #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
You might like
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
PHP插入排序实现代码
2013/04/04 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
Yii2中datetime类的使用
2016/12/17 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
python实现simhash算法实例
2014/04/25 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python下简易的单例模式详解
2019/04/08 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
大学生应聘求职信
2014/05/26 职场文书
2015年复活节活动总结
2015/02/27 职场文书
警示教育观后感
2015/06/17 职场文书