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 相关文章推荐
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
python实现归并排序算法
Nov 22 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
python模块导入的方法
Oct 24 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
Python使用sqlite3模块内置数据库
May 07 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
python如何将图片转换素描画
Sep 08 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
Python源码解析之List
May 21 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 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
谈谈新手如何学习PHP
2006/12/23 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python抓取框架 Scrapy的架构
2016/08/12 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
Python实现代码块儿折叠
2020/04/15 Python
python实现人工蜂群算法
2020/09/18 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python