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函数形参用法实例分析
Aug 04 Python
Python实现的knn算法示例
Jun 14 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
python处理excel绘制雷达图
Oct 18 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
在主流系统之上安装Pygame的方法
May 20 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
详解pytorch创建tensor函数
Mar 22 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&MYSQL分页原理及实现
2007/01/02 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
php操作access数据库的方法详解
2017/02/22 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
Python continue语句用法实例
2014/03/11 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
新电JAVA笔试题目
2014/08/31 面试题
简述数据库的设计过程
2015/06/22 面试题
程序集与命名空间有什么不同
2014/07/25 面试题
户外拓展活动方案
2014/02/11 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
师德演讲稿范文
2014/05/06 职场文书
介绍信的格式
2015/01/30 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python