MEP25:序列化#
状态#
已拒绝
这项工作很重要,但这项特殊的努力已经停滞.
分支和 Pull requests#
开发分支:
相关拉取请求:
摘要#
此 MEP 旨在添加可序列化的 Controller 对象,以充当 Artist 管理器.用户将通过 Controller 向 Artist 传达更改.通过这种方式,可以逐步添加 Controller 对象的功能,因为每个 Artist 仍然负责绘制所有内容.目标是创建一个 API,该 API 既可以被需要图形高级描述的图形库使用,也可以被需要低级解释的库使用.
详细描述#
Matplotlib 是一个核心绘图引擎,许多用户已经理解它的 API.对于其他图形库来说,很难/不可能(1)获得完整的图形描述,(2)按照用户提供的方式从图形对象输出原始数据,(3)在没有启发式方法的情况下理解图形对象的语义,以及(4)给 matplotlib 一个完整的图形描述以进行可视化.此外,由于 Artist 不知道它自己在图形中的语义,因此很难以自然的方式与它们交互.
从这个意义上讲,matplotlib 将采用标准的 Model-View-Controller (MVC) 框架.Model 将是用户定义的数据,样式和语义.Views 是每个单独 Artist 的集合,它们负责基于模型生成最终图像.Controller 将是 Controller 对象,管理其 Artist 对象集.
Controller 必须能够按命令导出它携带的关于图形的信息,可能通过 to_json 方法或类似的方法.因为使用控制器复制模型中的所有信息将是非常多余的,所以只显式保留用户指定的信息(数据 + 样式).如果用户想要来自 view/model 的更多信息(默认值),它应该能够查询它.
这样做可能很烦人,未指定的 kwargs 是从 rcParams 对象中提取的,而 rcParams 对象又是通过读取用户指定的文件创建的,并且可以在运行时动态更改.我想我们可以保留一个默认默认值的字典,并与此进行比较.目前尚不清楚这如何与样式表 [[MEP26]] 交互 - @tacaswell
补充说明:
"原始数据" 不一定需要是
list,ndarray等.更抽象地说,它可以仅具有在需要时生成数据的方法.由于
Controller将包含用户可能不想保留的额外信息,因此默认情况下不应创建它.您应该能够 (a) 使用图形实例化Controller和 (b) 使用Controller构建图形.
使用案例:
导出所有必要的informat
序列化一个 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
从控制器管理 artist(例如,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对象的基本Controller对象(例如,Hist)评论:
初始化应该通过解包
**来完成,因此我们需要最终尝试控制的Artist的调用签名参数的副本.不幸的硬编码重复...每个
Artist接受的额外*kwargs是否应该在Controller中跟踪?Controller如何知道哪个 artist 属于哪里?例如,我们需要传递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 将会改变
非仿射变换将需要定义的 pickling 方法
替代方案#
PR #3150 建议通过将额外的容器寄生地附加到 axes 对象来添加语义.这是一个更完整的解决方案,应该是一个更发达/灵活/强大的框架.