MEP25: 序列化#
状态#
被拒绝
这项工作很重要,但这次特别的努力已经停滞了。
分支和拉取请求#
开发分支:
相关拉取请求:
摘要#
本 MEP 旨在添加一个可序列化的 Controller 对象,作为 Artist 的管理者。用户将通过 Controller 与 Artist 进行通信。这样,Controller 对象的功能可以逐步增加,因为每个 Artist 仍然负责绘制所有内容。目标是创建一个既适用于需要图形高层次描述的图形库,也适用于需要低层次解释的库的 API。
详细描述#
Matplotlib 是一个核心绘图引擎,其API已被许多用户所理解。其他图形库很难(1)获取完整的图形描述,(2)将图形对象的原始数据输出为用户提供的数据,(3)在不使用启发式方法的情况下理解图形对象的语义,以及(4)向matplotlib提供完整的图形描述以进行可视化。此外,由于 Artist 在图形中没有自己的语义概念,因此很难以自然的方式与之交互。
从这个意义上说,matplotlib 将采用标准的 Model-View-Controller (MVC) 框架。模型 是用户定义的数据、样式和语义。视图 是每个单独 Artist 的集合,它们负责根据 模型 生成最终图像。控制器 将是管理其 Artist 对象集合的 Controller 对象。
Controller 必须能够根据命令导出其携带的关于图形的信息,可能是通过 to_json 方法或类似的方式。因为复制模型中的所有信息到控制器中会非常多余,所以只明确保留用户指定的信息(数据 + 样式)。如果用户想要从视图/模型中获取更多信息(默认值),它应该能够查询这些信息。
这可能会很烦人,未指定的 kwargs 是从 rcParams 对象中提取的,该对象反过来是从用户指定的文件中读取的,并且可以在运行时动态更改。我想我们可以保留一个默认默认值的字典并与之比较。不清楚这将如何与样式表 [[MEP26]] 交互 - @tacaswell
附加说明:
“原始数据” 不一定需要是一个
列表、ndarray等。相反,它可以更抽象地仅在需要时有一个生成数据的方法。因为
Controller将包含用户可能不希望保留的额外信息,所以它不应该默认创建。你应该能够同时 (a) 用图形实例化一个Controller和 (b) 用Controller构建一个图形。
用例:
导出所有必要信息
序列化一个 matplotlib 图形,保存它,并能够在以后重新运行。
任何其他源向 matplotlib 发送适当格式的表示以打开
示例#
以下是控制器应能执行的一些示例。
从序列化表示(例如,JSON)实例化一个 matplotlib 图形:
import json from matplotlib.controllers import Controller with open('my_figure') as f: o = json.load(f) c = Controller(o) fig = c.figure
从控制器管理艺术家(例如,Line2D):::
# not really sure how this should look c.axes[0].lines[0].color = 'b' # ?
导出可序列化的图形表示::
o = c.to_json() # or... we should be able to throw a figure object in there too o = Controller.to_json(mpl_fig)
实现#
创建能够管理
Artist对象(例如,Hist)的基Controller对象。注释:
初始化应通过解包
**进行,因此我们需要一个调用签名参数的副本,用于我们最终试图控制的Artist。不幸的硬编码重复...是否应该在
Controller中跟踪每个Artist接受的额外**kwargsController如何知道哪个艺术家属于哪里?例如,我们需要传递axes引用吗?
进度:
一个简单的 NB 演示了
Line2DController对象的一些功能:https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
为
Controller编写协议以 更新 模型。注释:
应该如何处理容器?例如,当我们重新分箱一个直方图时,旧的补丁会发生什么?
在链接 (1) 中,旧行被完全销毁并重新绘制,如果有什么东西引用了它怎么办?
创建一个方法,可以从
Controllers组装一个 json 对象处理图形的不可序列化方面(例如,非仿射变换?)
能够从序列化表示中实例化
重新实现现有的 pyplot 和 Axes 方法,例如
pyplot.hist和Axes.hist,基于新的控制器类。
> @theengineer: 在 #2 中,你说的从每个 Artist 那里 获取更新 是什么意思?
^ 是的。Controller 不应该 需要更新。这只是在 #3 中发生。当你看到这个时,删除评论。
向后兼容性#
pickling 将会改变
非仿射变换将需要定义一个序列化方法
替代方案#
PR #3150 建议通过寄生方式将额外容器附加到轴对象上来添加语义。这是一个更完整的解决方案,应该是一个更发达/灵活/强大的框架。