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中的pprint折腾记
Jan 21 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
python中的随机函数小结
Jan 27 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
python实现学生通讯录管理系统
Feb 25 Python
python实现简易名片管理系统
Apr 11 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python Http请求json解析库用法解析
2020/11/28 Python
selenium如何定位span元素的实现
2021/01/13 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
报到证丢失证明
2014/01/11 职场文书
大学自我评价
2014/02/12 职场文书
创先争优宣传标语
2014/10/08 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python