MEP23:每个 GUI 窗口有多个图形#

状态#

讨论

分支和拉取请求#

以前的工作 - https://github.com/matplotlib/matplotlib/pull/2465 删除

摘要#

添加将多个数字分组在同一个下的可能性 FigureManager

详细说明#

在当前结构下,每个画布都有自己的窗口。

对于大多数用例来说,这是并且可能继续是所需的操作方法。

有时当同时打开太多图形时,希望能够将它们分组在同一个窗口下 [参见]( https://github.com/matplotlib/matplotlib/issues/2194 )。

建议的解决方案修改FigureManagerBase为包含和管理多个Canvas. 设置参数rcParams["backend.multifigure"]控制何时需要MultiFigure行为。

笔记

需要注意的是,建议的解决方案假设 [MEP22]( https://github.com/matplotlib/matplotlib/wiki/Mep22 ) 已经到位。这仅仅是因为实际的实现Toolbar使得在画布之间切换非常困难。

实施#

第一个实现将在 GTK3 中使用 Notebook 作为画布容器完成。

FigureManagerBase#

将添加以下新方法

  • add_canvas:将画布添加到现有 FigureManager对象

  • remove_canvas: 从一个 FigureManager对象中移除一个画布,如果它是最后一个,它将被销毁

  • move_canvas:将画布从一个FigureManager 移到另一个。

  • set_canvas_title:更改与特定画布容器关联的标题

  • get_canvas_title:获取与特定画布容器关联的标题

  • get_active_canvas:获取位于前台并受 gui 事件影响的画布。没有set_active_canvas ,因为活动画布是show在对象上调用时定义的 Canvas

new_figure_manager#

为了控制哪些FigureManager将包含新图形,将添加一个额外的可选参数figuremanager,该参数值将传递给new_figure_manager_given_figure.

new_figure_manager_given_figure#

  • 如果给出了figuremanager参数, FigureManager则将使用此对象而不是创建一个新对象。

  • 如果rcParams['backend.multifigure']为真: FigureManager将使用最后一个对象而不是创建一个新对象。

向后兼容性#

为了使MultiFigure属性可见,用户必须直接激活它们设置rcParams['backend.multifigure'] = True

它应该向后兼容遵循当前FigureManagerBase结构的后端,即使它们尚未实现MultiFigure魔法。

替代方案#

除了修改之外,FigureManagerBase还可以添加一个并行类来处理 . 这将保证定制后端不会有任何问题,但也会使代码更大,需要维护的东西更多。rcParams['backend.multifigure'] = True