python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解


Posted in Python onFebruary 25, 2021

matplotlib工具栏源码探析二(添加、删除内置工具项)探讨了工具栏内置工具项的管理,除了内置工具项,很多场景中需要自定义工具项,官方给出了案例https://matplotlib.org/gallery/user_interfaces/toolmanager_sgskip.html,主要基于matplotlib.backend_managers.ToolManager类实现,即使用工具栏管理器模式。

官方案例解析

下面对官方案例关键点做注释说明。

import matplotlib.pyplot as plt
# 设置工具栏使用工具栏管理器模式
plt.rcParams['toolbar'] = 'toolmanager'
# 导入工具项的基类ToolBase和ToolToggleBase
from matplotlib.backend_tools import ToolBase, ToolToggleBase

# 因为工具项必须以类的形式添加,所以创建自定义基本工具项类,基类为ToolBase
class ListTools(ToolBase):
 # 该工具项的功能为列出工具栏管理器管理的所有工具项
 """List all the tools controlled by the `ToolManager`."""
 # 设置默认快捷键和工具项描述
 default_keymap = 'm'
 description = 'List Tools'
 
 # 定义工具项被触发时的动作
 def trigger(self, *args, **kwargs):
  print('_' * 80)
  print("{0:12} {1:45} {2}".format(
   'Name (id)', 'Tool description', 'Keymap'))
  print('-' * 80)
  # 获取工具栏管理器管理的所有工具项
  tools = self.toolmanager.tools
  # 输出各个工具项
  for name in sorted(tools):
   if not tools[name].description:
    continue
   keys = ', '.join(sorted(self.toolmanager.get_tool_keymap(name)))
   print("{0:12} {1:45} {2}".format(
    name, tools[name].description, keys))
  print('_' * 80)
  print("Active Toggle tools")
  print("{0:12} {1:45}".format("Group", "Active"))
  print('-' * 80)
  for group, active in self.toolmanager.active_toggle.items():
   print("{0:12} {1:45}".format(str(group), str(active)))

# 基于ToolToggleBase创建自定义切换式工具项,切换式工具项在触发时会在生效和失效两种状态之间切换
class GroupHideTool(ToolToggleBase):
 # 该工具项的功能为根据分组切换显示/隐藏数据元素
 """Show lines with a given gid."""
 # 设置默认快捷键和工具项描述
 default_keymap = 'G'
 description = 'Show by gid'
 default_toggled = True
 
 # 构造函数的参数gid为数据元素的分组
 def __init__(self, *args, gid, **kwargs):
  self.gid = gid
  super().__init__(*args, **kwargs)
 # 定义工具项生效时的方法
 def enable(self, *args):
  self.set_lines_visibility(True)
 # 定义工具项失效时的方法
 def disable(self, *args):
  self.set_lines_visibility(False)

 def set_lines_visibility(self, state):
  for ax in self.figure.get_axes():
   for line in ax.get_lines():
    if line.get_gid() == self.gid:
     line.set_visible(state)
  # 注意!在图像生成之后,修改图像中的元素必须重绘
  self.figure.canvas.draw()


fig = plt.figure()
# 注意通过gid属性可以为数据元素分组
plt.plot([1, 2, 3], gid='mygroup')
plt.plot([2, 3, 4], gid='unknown')
plt.plot([3, 2, 1], gid='mygroup')

# 将自定义的工具项添加添加到工具栏管理器,格式为 工具项名称 工具项类 其他参数
fig.canvas.manager.toolmanager.add_tool('List', ListTools)
fig.canvas.manager.toolmanager.add_tool('Show', GroupHideTool, gid='mygroup')

# 可以反复添加已存在的工具项
# Add an existing tool to new group `foo`.
# It can be added as many times as we want
fig.canvas.manager.toolbar.add_tool('zoom', 'foo')

# 删除工具项
# Remove the forward button
fig.canvas.manager.toolmanager.remove_tool('forward')

# 新添加到工具栏管理器的工具项还不能直接使用,需要通过toolbar对象添加到当前工具栏
# 如果不将自定义的工具项添加到工具栏管理器,直接使用toolbar对象添加则会报错
# 将自定义的工具项Show添加到内置的navigation组的特定位置(即组内第2个位置)
# To add a custom tool to the toolbar at specific location inside
# the navigation group
fig.canvas.manager.toolbar.add_tool('Show', 'navigation', 1)
#fig.canvas.manager.toolbar.add_tool('List', 'navigation', 2)
plt.show()

官方案例运行结果

运行后自定义的Show按钮处于生效状态,3条线全部显示。

python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解

点击Show按钮,使之处理失效状态,mygroup组的两条线不再显示。

python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解

由于案例中仅将List工具项添加到工具栏管理器,但是没有添加到工具栏中,因此List工具项未在工具栏中显示。但是List工具项的快捷键m是生效的,在界面上按快捷键m,控制台输出以下信息。

________________________________________________________________________________
Name (id) Tool description        Keymap
--------------------------------------------------------------------------------
List   List Tools         m
Show   Show by gid         G
allnav  Enable all axes toolmanager     a
back   Back to previous view       MouseButton.BACK, backspace, c, left
copy   Copy the canvas figure to clipboard   cmd+c, ctrl+c
fullscreen Toggle fullscreen mode      ctrl+f, f
grid   Toggle major grids       g
grid_minor Toggle major and minor grids
help   Print tool list, shortcuts and description f1
home   Reset original view       h, home, r
nav   Enable one axes toolmanager     1, 2, 3, 4, 5, 6, 7, 8, 9
pan   Pan axes with left mouse, zoom with right  p
quit   Quit the figure        cmd+w, ctrl+w, q
quit_all  Quit all figures
save   Save the figure        ctrl+s, s
subplots  Configure subplots
xscale  Toggle scale X axis       L, k
yscale  Toggle scale Y axis       l
zoom   Zoom to rectangle        o
________________________________________________________________________________
Active Toggle tools
Group  Active
--------------------------------------------------------------------------------
default  None
None   {'Show'}

总结

matplotlib支持两种工具项:基本工具项(基类ToolBase)和切换式工具项(基类ToolToggleBase)。
基本工具项需要注意定义trigger方法,即工具项被触发时的动作。
切换式工具项需要注意定义enabledisable方法,即生效和失效两种状态的动作,如方法定义中牵扯到修改图像,需要注意重绘图像。
注意添加自定义工具项的流程!先将自定义的工具项添加到工具栏管理器,然后再添加到当前工具栏!内置工具项之所以不用添加到工具栏管理器是因为它们本身就已经添加在工具栏管理器!

到此这篇关于matplotlib工具栏源码探析三之添加、删除自定义工具项的文章就介绍到这了,更多相关matplotlib工具栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过BF算法实现关键词匹配的方法
Mar 13 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
解决Python中回文数和质数的问题
Nov 24 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
python实现简单文件读写函数
Feb 25 #Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 #Python
python网络爬虫实现发送短信验证码的方法
Feb 25 #Python
python openpyxl模块的使用详解
Feb 25 #Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 #Python
python如何实现递归转非递归
Feb 25 #Python
Python如何使用神经网络进行简单文本分类
Feb 25 #Python
You might like
php中explode与split的区别介绍
2012/10/03 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
js实现进度条的方法
2015/02/13 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
入党申请自荐书范文
2014/02/11 职场文书
违反交通法规检讨书
2014/09/10 职场文书
后备干部推荐材料
2014/12/24 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
如何写观后感
2015/06/19 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
python数字类型和占位符详情
2022/03/13 Python