使用matplotlib
绘图时,在弹出的窗口中默认是有工具栏的,那么这些工具栏是如何定义的呢?
工具栏的三种模式
matplotlib
的基础配置由运行时参数(rcParams
)控制,导入matplotlib
时,加载matplotlibrc
文件生成默认运行时参数。
查看matplotlibrc
文件可知#toolbar: toolbar2 # {None, toolbar2, toolmanager}
,即工具栏有三种模式None
、toolbar2
和toolmanager
,其中默认模式为toolbar2
。
工具栏模式切换
通过类似语句plt.rcParams['toolbar'] = 'None'
可控制工具栏的模式。
需要注意的是plt.rcParams['toolbar'] = 'None'
应当放置在图像实例化之前。
None
模式:禁用工具栏。
plt.rcParams['toolbar'] = 'None'
toolbar2
模式:默认工具栏布局。
plt.rcParams['toolbar'] = 'toolbar2'
toolmanager
模式:工具栏布局模式与toolbar2
模式稍有不同。
plt.rcParams['toolbar'] = 'toolmanager'
工具栏模式切换原理
和工具栏相关的模块有:
- matplotlib.backend_bases
- matplotlib.backend_managers
- matplotlib.backend_tools
- matplotlib.backends
工具栏最终依靠后端实现,不同的后端具体实现会有一些差异,我选择的后端是Pyqt5
,通过查看模块matplotlib.backends.backend_qt5
源码可知,matplotlib
在利用后端生成窗口时根据rcParams['toolbar']
的值选择不同的工具栏构造方式。
def _get_toolbar(self, canvas, parent): # must be inited after the window, drawingArea and figure # attrs are set if matplotlib.rcParams['toolbar'] == 'toolbar2': toolbar = NavigationToolbar2QT(canvas, parent, True) elif matplotlib.rcParams['toolbar'] == 'toolmanager': toolbar = ToolbarQt(self.toolmanager, self.window) else: toolbar = None return toolbar
默认模式(toolbar2)原理
与该模式相关的重要定义有:
matplotlib.backend_bases.NavigationToolbar2(canvas)
类:默认的toolbar2
模式工具栏的基类,后端需要通过canvas
对象处理工具栏按钮事件、覆盖构造方法初始化工具栏、覆盖save_figure()
等方法。matplotlib.backends.backend_qt5.NavigationToolbar2QT(NavigationToolbar2, QtWidgets.QToolBar)
类:定义了QT后端默认模式工具栏的具体实现。matplotlib.backend_bases.FigureCanvasBase
类:canvas
对象的基类,通过toolbar
属性与工具栏进行连接。matplotlib.backend_bases.NavigationToolbar2(canvas).toolitems
属性:定义了默认模式工具栏工具项列表。
案例:验证默认模式工具栏布局
import matplotlib.pyplot as plt fig=plt.gcf() toolbar = fig.canvas.manager.toolbar print(toolbar.toolitems)
输出:
[('Home', 'Reset original view', 'home', 'home'),
('Back', 'Back to previous view', 'back', 'back'),
('Forward', 'Forward to next view', 'forward', 'forward'),
(None, None, None, None),
('Pan', 'Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect', 'move', 'pan'),
('Zoom', 'Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect', 'zoom_to_rect', 'zoom'),
('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'),
('Customize', 'Edit axis, curve and image parameters', 'qt4_editor_options', 'edit_parameters'),
(None, None, None, None),
('Save', 'Save the figure', 'filesave', 'save_figure')]
根据源码可知,列表中每个元组为工具项定义,元组的四个元素分别表示按钮名称、按钮提示文本、按钮图像、按钮对应方法。
# list of toolitems to add to the toolbar, format is: # ( # text, # the text of the button (often not visible to users) # tooltip_text, # the tooltip shown on hover (where possible) # image_file, # name of the image for the button (without the extension) # name_of_method, # name of the method in NavigationToolbar2 to call # )
工具栏管理器模式(toolmanager)原理
与该模式相关的重要定义有:
matplotlib.backend_bases.ToolContainerBase(toolmanager)
类:工具栏容器的基类,定义了工具栏编辑的方法。构造函数参数为toolmanager
,表示工具栏容器容纳的工具栏。matplotlib.backend_managers.ToolManager(figure=None)
类:管理用户触发工具栏工具项按钮而产生的动作。matplotlib.backend_tools.ToolBase
类:所有工具栏工具项的基类,所有工具项均由matplotlib.backend_managers.ToolManager
实例化。matplotlib.backend_tools.default_tools
变量:字典类型,实例化基于matplotlib.backend_tools.ToolBase
类定义的内置工具项。matplotlib.backend_tools.default_toolbar_tools
变量:嵌套列表,以类似格式[[分组1, [工具1, 工具2 ...]], [分组2, [...]]]
定义工具栏布局。matplotlib.backend_tools.add_tools_to_container
函数:设置toolbarmanager
模式默认工具栏。
案例:验证工具栏管理器模式工具栏布局
import matplotlib.pyplot as plt plt.rcParams['toolbar'] = 'toolmanager' fig=plt.gcf() toolbar= fig.canvas.manager.toolbar print(toolbar._toolitems)
输出:
{'home': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EABBC1F8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC510>)],
'back': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE86678>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC598>)],
'forward': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE8B4C8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC620>)],
'pan': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE8BAF8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC6A8>)],
'zoom': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93DC8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC7B8>)],
'subplots': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93438>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC8C8>)],
'save': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93678>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC950>)],
'help': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93A68>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC9D8>)]}
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】