matplotlib事件处理基础(事件绑定、事件属性)


Posted in Python onFebruary 03, 2021

谈到用户界面交互总少不了事件,前面一系列文章介绍的鼠标光标、坐标、弹出式提示框等实现的底层其实都是事件处理,只不过matplotlib或其他包做了封装以便于应用。

matplotlib的事件处理模型基于GTK,matplotlib支持与wxpython、 tkinter、 qt、gtk等常见GUI后端的交互。

事件绑定

matplotlib的事件绑定有三个要素:

  • canvas对象
  • 事件名称
  • 回调函数

matplotlib的事件绑定由canvas对象调用mpl_connect方法实现,mpl_connect方法有两个参数:事件名称、回调函数。即canvas对象.mpl_connect(事件名称,回调函数)

mpl_connect方法又称为事件管理器,它是FigureCanvasBase类的方法。FigureCanvasBase类属于matplotlib.backend_bases模块,作用是隔离绘图和后端底层,这样绘图时就不用考虑各个后端之间的差异。

canvas原意画布,figure原意图像,可以这样理解,figure是一切可见绘图元素的集合,而canvas是figure的容器,canvas的事件的响应、处理都是基于canvas的。

下面通过一个案例来简单说明事件绑定的应用。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,1])

def onclick(event):
  print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
     ('double' if event.dblclick else 'single', event.button,
      event.x, event.y, event.xdata, event.ydata))

cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show()

运行后,在图像界面上单击鼠标,控制台会出现如下输出。

single click: button=1, x=123, y=80, xdata=0.222531, ydata=0.960511

在本案例中,fig为figure对象,fig的canvas属性可以返回当前图像所在的canvas对象,然后再调用mpl_connect方法,'button_press_event'为鼠标左键单击事件,onclick为回调函数。

事件

matplotlib中用到的事件类都继承自matplotlib.backend_bases.Event,主要事件如下表所示。

事件名称 描述
‘button_press_event' MouseEvent 鼠标按键被按下
‘button_release_event' MouseEvent 鼠标按键被释放
‘draw_event' DrawEvent 画布绘图
‘key_press_event' KeyEvent 键盘按键被按下
‘key_release_event' KeyEvent 键盘按键被释放
‘motion_notify_event' MouseEvent 鼠标移动
‘pick_event' PickEvent 画布中的对象被选中
‘resize_event' ResizeEvent 图形画布大小改变
‘scroll_event' MouseEvent 鼠标滚轮被滚动
‘figure_enter_event' LocationEvent 鼠标进入新的图形
‘figure_leave_event' LocationEvent 鼠标离开图形
‘axes_enter_event' LocationEvent 鼠标进入新的轴域
‘axes_leave_event' LocationEvent 鼠标离开轴域

事件属性

因为matplotlib中用到的事件类都继承自matplotlib.backend_bases.Event,所以所有事件都拥有以下3个共同属性。
name:事件名称。
canvas:生成事件的canvas对象。
guiEvent:触发matplotlib事件的GUI事件,默认为None。
所有事件均定义在matplotlib.backend_bases模块中,其中常用的鼠标事件MouseEvent、键盘事件KeyEvent都继承自LocationEvent事件。LocationEvent事件有5个属性。

  • x:x 位置,距离画布左端的像素数
  • y:y 位置,距离画布底端的像素数
  • inaxes:是否处于坐标系中,是则为鼠标所处于的子图实例,否则为None
  • xdata:鼠标的x坐标
  • ydata:鼠标的y坐标

键盘事件KeyEvent除继承自LocationEvent事件的5个属性外,还有1个key属性,表示按下的键,值范围为:None、任何字符、'shift'、win或者control。
鼠标事件MouseEvent 除继承自LocationEvent事件的5个属性外,还有以下属性

  • key:表示鼠标事件触发时按下的键,值范围同键盘事件KeyEvent中的key属性。
  • button:表示按下的鼠标按钮,值范围为:None、1、2、3、up、down(up、down用于滚动事件)。
  • dblclick:表示是否双击,布尔值。

鼠标事件案例

鼠标点击画线,将鼠标点击相邻两点用直线连接,起始点为0,0。

from matplotlib import pyplot as plt

class LineBuilder:
  def __init__(self, line):
    self.line = line
    self.xs = list(line.get_xdata())
    self.ys = list(line.get_ydata())
    self.cid = line.figure.canvas.mpl_connect('button_press_event', self)

  def __call__(self, event):
    print('click', event)
    if event.inaxes!=self.line.axes: return
    self.xs.append(event.xdata)
    self.ys.append(event.ydata)
    self.line.set_data(self.xs, self.ys)
    self.line.figure.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0]) # empty line
linebuilder = LineBuilder(line)

plt.show()

到此这篇关于matplotlib事件处理基础(事件绑定、事件属性)的文章就介绍到这了,更多相关matplotlib 事件处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
寻找网站后台地址的python脚本
Sep 01 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python之reload流程实例代码解析
Jan 29 Python
python-str,list,set间的转换实例
Jun 27 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
Python基于template实现字符串替换
Nov 27 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
想学画画?python满足你!
Dec 24 Python
深度学习详解之初试机器学习
Apr 14 Python
python装饰器代码解析
Mar 23 Python
matplotlib相关系统目录获取方式小结
Feb 03 #Python
详解matplotlib绘图样式(style)初探
Feb 03 #Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 #Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 #Python
matplotlib更改窗口图标的方法示例
Feb 03 #Python
python中添加模块导入路径的方法
Feb 03 #Python
浅谈matplotlib默认字体设置探索
Feb 03 #Python
You might like
php使用websocket示例详解
2014/03/12 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
js实现随机点名程序
2020/09/17 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
python压包的概念及实例详解
2021/02/17 Python
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
工商管理毕业生推荐信
2013/12/24 职场文书
亲子读书活动方案
2014/02/22 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL