MEP23: 每个GUI窗口的多张图#

状态#

讨论

分支和拉取请求#

先前的工作 - matplotlib/matplotlib#2465 待删除

摘要#

增加在同一个 FigureManager 下分组多个图表的可能性

详细描述#

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

这是并且可能继续成为大多数使用场景下的理想操作方法。

有时当同时打开太多图形时,能够将这些图形分组在同一个窗口下是可取的。参见 PR #2194

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

注意

需要注意的是,所提出的解决方案假设 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 ,因为活动画布是在 Canvas 对象上调用 show 时定义的。

new_figure_manager#

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

new_figure_manager_given_figure#

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

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

向后兼容性#

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

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

替代方案#

与其修改 FigureManagerBase,不如添加一个并行的类,处理 rcParams['backend.multifigure'] = True 的情况。这将保证自定义后端不会出现问题,但也会使代码变大,需要维护的内容增多。