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

时间:2021-11-28 08:42:52

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

官方案例解析

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

  1. import matplotlib.pyplot as plt
  2. # 设置工具栏使用工具栏管理器模式
  3. plt.rcParams['toolbar'] = 'toolmanager'
  4. # 导入工具项的基类ToolBase和ToolToggleBase
  5. from matplotlib.backend_tools import ToolBase, ToolToggleBase
  6.  
  7. # 因为工具项必须以类的形式添加,所以创建自定义基本工具项类,基类为ToolBase
  8. class ListTools(ToolBase):
  9. # 该工具项的功能为列出工具栏管理器管理的所有工具项
  10. """List all the tools controlled by the `ToolManager`."""
  11. # 设置默认快捷键和工具项描述
  12. default_keymap = 'm'
  13. description = 'List Tools'
  14.  
  15. # 定义工具项被触发时的动作
  16. def trigger(self, *args, **kwargs):
  17. print('_' * 80)
  18. print("{0:12} {1:45} {2}".format(
  19. 'Name (id)', 'Tool description', 'Keymap'))
  20. print('-' * 80)
  21. # 获取工具栏管理器管理的所有工具项
  22. tools = self.toolmanager.tools
  23. # 输出各个工具项
  24. for name in sorted(tools):
  25. if not tools[name].description:
  26. continue
  27. keys = ', '.join(sorted(self.toolmanager.get_tool_keymap(name)))
  28. print("{0:12} {1:45} {2}".format(
  29. name, tools[name].description, keys))
  30. print('_' * 80)
  31. print("Active Toggle tools")
  32. print("{0:12} {1:45}".format("Group", "Active"))
  33. print('-' * 80)
  34. for group, active in self.toolmanager.active_toggle.items():
  35. print("{0:12} {1:45}".format(str(group), str(active)))
  36.  
  37. # 基于ToolToggleBase创建自定义切换式工具项,切换式工具项在触发时会在生效和失效两种状态之间切换
  38. class GroupHideTool(ToolToggleBase):
  39. # 该工具项的功能为根据分组切换显示/隐藏数据元素
  40. """Show lines with a given gid."""
  41. # 设置默认快捷键和工具项描述
  42. default_keymap = 'G'
  43. description = 'Show by gid'
  44. default_toggled = True
  45.  
  46. # 构造函数的参数gid为数据元素的分组
  47. def __init__(self, *args, gid, **kwargs):
  48. self.gid = gid
  49. super().__init__(*args, **kwargs)
  50. # 定义工具项生效时的方法
  51. def enable(self, *args):
  52. self.set_lines_visibility(True)
  53. # 定义工具项失效时的方法
  54. def disable(self, *args):
  55. self.set_lines_visibility(False)
  56.  
  57. def set_lines_visibility(self, state):
  58. for ax in self.figure.get_axes():
  59. for line in ax.get_lines():
  60. if line.get_gid() == self.gid:
  61. line.set_visible(state)
  62. # 注意!在图像生成之后,修改图像中的元素必须重绘
  63. self.figure.canvas.draw()
  64.  
  65. fig = plt.figure()
  66. # 注意通过gid属性可以为数据元素分组
  67. plt.plot([1, 2, 3], gid='mygroup')
  68. plt.plot([2, 3, 4], gid='unknown')
  69. plt.plot([3, 2, 1], gid='mygroup')
  70.  
  71. # 将自定义的工具项添加添加到工具栏管理器,格式为 工具项名称 工具项类 其他参数
  72. fig.canvas.manager.toolmanager.add_tool('List', ListTools)
  73. fig.canvas.manager.toolmanager.add_tool('Show', GroupHideTool, gid='mygroup')
  74.  
  75. # 可以反复添加已存在的工具项
  76. # Add an existing tool to new group `foo`.
  77. # It can be added as many times as we want
  78. fig.canvas.manager.toolbar.add_tool('zoom', 'foo')
  79.  
  80. # 删除工具项
  81. # Remove the forward button
  82. fig.canvas.manager.toolmanager.remove_tool('forward')
  83.  
  84. # 新添加到工具栏管理器的工具项还不能直接使用,需要通过toolbar对象添加到当前工具栏
  85. # 如果不将自定义的工具项添加到工具栏管理器,直接使用toolbar对象添加则会报错
  86. # 将自定义的工具项Show添加到内置的navigation组的特定位置(即组内第2个位置)
  87. # To add a custom tool to the toolbar at specific location inside
  88. # the navigation group
  89. fig.canvas.manager.toolbar.add_tool('Show', 'navigation', 1)
  90. #fig.canvas.manager.toolbar.add_tool('List', 'navigation', 2)
  91. plt.show()

官方案例运行结果

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

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

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

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

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

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

总结

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

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

原文链接:https://blog.csdn.net/mighty13/article/details/112590882