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学习RabbitMQ消息队列
Nov 30 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python字符串逆序的实现方法【一题多解】
Feb 18 Python
python3反转字符串的3种方法(小结)
Nov 07 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
python调用win32接口进行截图的示例
Nov 11 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
Python入门之基础语法详解
May 11 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使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
js遍历td tr等html元素
2012/12/13 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
JS实现多选框的操作
2020/06/24 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
python三方库之requests的快速上手
2019/03/04 Python
Python3.8中使用f-strings调试
2019/05/22 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
2014年最新学校运动会广播稿
2014/09/17 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
指导老师鉴定意见
2015/06/05 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers