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操作redis的方法
Jul 07 Python
Python堆排序原理与实现方法详解
May 11 Python
Python全排列操作实例分析
Jul 24 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
Python中的引用知识点总结
May 20 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
总结Pyinstaller打包的高级用法
Jun 28 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
xml+php动态载入与分页
2006/10/09 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
详解React 条件渲染
2020/07/08 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
python抓取网页内容示例分享
2014/02/24 Python
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
Python装饰器的函数式编程详解
2015/02/27 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
学生社团文化节开幕式主持词
2014/03/28 职场文书
主要负责人任命书
2014/06/06 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
志愿者事迹材料
2014/12/26 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
导游词之天津古文化街
2019/11/09 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android