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中urllib.unquote乱码的原因与解决方法
Apr 24 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
简单实现Python爬取网络图片
Apr 01 Python
Python实现购物车程序
Apr 16 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
Python Http请求json解析库用法解析
Nov 28 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
PHP安装攻略:常见问题解答(一)
2006/10/09 PHP
在普通HTTP上安全地传输密码
2007/07/21 PHP
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php数据库备份还原类分享
2014/03/20 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
php统计数组元素个数的方法
2015/07/02 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
php接口隔离原则实例分析
2019/11/11 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
详解react-redux插件入门
2018/04/19 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
对于Python深浅拷贝的理解
2019/07/29 Python
python输出决策树图形的例子
2019/08/09 Python
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
社会调查研究计划书
2014/05/01 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书