matplotlib部件之矩形选区(RectangleSelector)的实现


Posted in Python onFebruary 01, 2021

矩形选区概述

矩形选区是一种常见的对象选择方式,这个名词最常见于Photoshop中,用于在一个子图选择鼠标拖动的矩形区域中的元素,在matplotlib中的矩形选区属于部件(widgets),matplotlib中的部件都是中性(neutral )的,即与具体后端实现无关。

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

RectangleSelector类的签名为class matplotlib.widgets.RectangleSelector(ax, onselect, drawtype='box', minspanx=0, minspany=0, useblit=False, lineprops=None, rectprops=None, spancoords='data', button=None, maxdist=10, marker_props=None, interactive=False, state_modifier_keys=None)

RectangleSelector类构造函数的参数为:

  • ax:矩形选区生效的子图,类型为matplotlib.axes.Axes的实例。
  • onselect:矩形选区完成后执行的回调函数,函数签名为def onselect(eclick: MouseEvent, erelease: MouseEvent),eclick和erelease分别为开始和结束选区时的鼠标事件。
  • drawtype:矩形选区的外观,取值范围为{"box", "line", "none"},"box"为矩形框,"line"为矩形选区对角线,"none"无外观,类型为字符串,默认值为"box"。
  • lineprops:当drawtype == "line"时线条的属性,默认值为dict(color="black", linestyle="-", linewidth=2, alpha=0.5)。
  • rectprops:当drawtype == "box"时矩形框的属性,默认值为dict(facecolor="red", edgecolor="black", alpha=0.2, fill=True)。
  • button:设置可用于触发矩形选区的鼠标键,MouseButton列表,默认为所有鼠标键。
  • interactive:是否允许交互,布尔值,默认为False,即选择完成后选区即消失,值为True时,选区选择完成后不消失,除非按快捷键解除。
  • state_modifier_keys:快捷键设置,类型为字典。
    • “move”: 移动已存在的选区,默认没有修饰键。
    • “clear”:清除现有选区,默认为 "escape",即esc键。
    • “square”:正方形选区,默认为"shift"。
    • “center”:以当前点作为选区的中心点,默认为 "ctrl"。
    • “square” 和 “center” 可以组合使用。

案例

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

案例说明

拖动鼠标画出矩形选区,默认为交互模式,显示选区框,按esc键取消选区,控制台显示选区的坐标和使用的鼠标键。按t键切换矩形选区功能的激活状态,非激活状态矩形选区功能不生效。

matplotlib部件之矩形选区(RectangleSelector)的实现

控制台输出:

(0.74, -0.38) --> (8.90, 0.75)
 The buttons you used were: 1 1

代码分析

from matplotlib.widgets import RectangleSelector
import numpy as np
import matplotlib.pyplot as plt

# 矩形选区选择时的回调函数
def line_select_callback(eclick, erelease):
  """
  Callback for line selection.

  *eclick* and *erelease* are the press and release events.
  """
  x1, y1 = eclick.xdata, eclick.ydata
  x2, y2 = erelease.xdata, erelease.ydata
  print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})")
  print(f" The buttons you used were: {eclick.button} {erelease.button}")

# 激活状态快捷键回调函数,active属性和set_active方法继承自_SelectorWidget类
def toggle_selector(event):
  print(' Key pressed.')
  if event.key == 't':
    if RS.active:
      print(' RectangleSelector deactivated.')
      RS.set_active(False)
    else:
      print(' RectangleSelector activated.')
      RS.set_active(True)

# 绘图
fig, ax = plt.subplots()
N = 100000 # If N is large one can see improvement by using blitting.
x = np.linspace(0, 10, N)

ax.plot(x, np.sin(2*np.pi*x)) # plot something
ax.set_title(
  "Click and drag to draw a rectangle.\n"
  "Press 't' to toggle the selector on and off.")

# 构造矩形选区实例,选取外观为矩形框,鼠标键为左键右键有效,允许保留选区
# drawtype is 'box' or 'line' or 'none'
RS = RectangleSelector(ax, line_select_callback,
                    drawtype='box', useblit=True,
                    button=[1, 3], # disable middle button
                    minspanx=5, minspany=5,
                    spancoords='pixels',
                    interactive=True)
# 绑定键盘事件,实现切换矩形选区激活状态功能
fig.canvas.mpl_connect('key_press_event', toggle_selector)
plt.show()

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

Python 相关文章推荐
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python进程间通信Queue实例解析
Jan 25 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
python logging模块的使用总结
Jul 09 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
Python爬虫requests库多种用法实例
May 28 Python
python开根号实例讲解
Aug 30 Python
Python实现生活常识解答机器人
Jun 28 Python
深入理解Python变量的数据类型和存储
Feb 01 #Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 #Python
Pytorch 图像变换函数集合小结
Feb 01 #Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 #Python
python中xlrd模块的使用详解
Feb 01 #Python
python中使用np.delete()的实例方法
Feb 01 #Python
flask框架中的cookie和session使用
Jan 31 #Python
You might like
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
jQuery 源码分析笔记
2011/05/25 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
js同时按下两个方向键
2007/12/01 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
微信小程序实现下拉框功能
2019/07/16 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
南京某公司笔试题
2013/01/27 面试题
安全资金保障制度
2014/01/23 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
食堂管理制度范本
2015/08/04 职场文书
Django显示可视化图表的实践
2021/05/10 Python
mysql事务隔离级别详情
2021/10/24 MySQL