MEP25:序列化#
状态#
被拒绝
这项工作很重要,但这项特别的努力已经停滞不前。
分支和拉取请求#
开发分支:
相关的拉取请求:
摘要#
该 MEP 旨在添加一个可序列化的Controller
对象来充当Artist
管理器。然后,用户将
Artist
通过 a 将更改传达给 a Controller
。通过这种方式,
Controller
对象的功能可以逐渐添加,因为每个
Artist
对象仍然负责绘制所有内容。目标是创建一个 API,该 API 既可用于需要对图形进行高级描述的图形库,也可用于需要低级解释的库。
详细说明#
Matplotlib 是一个核心绘图引擎,具有许多用户已经了解的 API。其他图形库很难/不可能(1)获得完整的图形描述,(2)从图形对象输出用户提供的原始数据,(3)在没有启发式的情况下理解图形对象的语义,以及( 4)给matplotlib一个完整的图形描述来可视化。此外,由于 anArtist
在图形中没有自己的语义概念,因此很难以自然的方式与它们交互。
从这个意义上说,matplotlib 将采用标准的模型-视图-控制器(MVC)框架。模型将是用户定义的数据、样式和语义。视图是每个个体的集合,Artist
它们负责根据模型生成最终图像。控制器将是
Controller
管理其对象集的Artist
对象。
Controller
必须能够通过命令或类似方法导出它携带的关于人物的信息to_json
。因为用控制器复制模型中的所有信息是非常无关紧要的,所以只有用户指定的信息(数据+样式)被明确保留。如果用户想从视图/模型中获得更多信息(默认值),它应该能够查询它。
这可能很烦人,未指定的 kwargs 是从 rcParams 对象中提取的,该对象又是通过读取用户指定的文件创建的,并且可以在运行时动态更改。我想我们可以保留默认默认值的字典并与之进行比较。不清楚这将如何与样式表交互 [[MEP26]] - @tacaswell
补充说明:
“原始数据”不一定需要是
list
,ndarray
等。相反,它可以更抽象地只是有一种方法来在需要时产生数据。因为
Controller
将包含用户可能不想保留的额外信息,所以默认情况下不应创建它。您应该能够(a)Controller
用图形实例化 a 和(b)用 a 构建图形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)
实施#
创建
Controller
能够管理 对象的基础Artist
对象(例如Hist
)注释:
初始化应该通过 unpacking 进行
**
,所以我们需要一个调用签名参数的副本,以便我们Artist
最终尝试控制。不幸的硬编码重复......**kwargs
每个人接受的额外费用是否应该Artist
在Controller
怎么
Controller
知道哪个艺术家属于哪里?例如,我们需要传递axes
引用吗?
进步:
一个简单的 NB 演示
Line2DController
对象的一些功能: https ://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
写入协议
Controller
以更新模型。注释:
容器应该如何处理?例如,当我们重新划分直方图时,旧补丁会发生什么情况?
在(1)的链接中,旧线被完全破坏并重新绘制,如果有东西引用它怎么办?
创建方法,通过该方法可以从
Controllers
处理序列化图形的不可序列化方面(例如,非仿射变换?)
能够从序列化的表示中实例化
重新实现现有的 pyplot 和 Axes 方法,例如
pyplot.hist
根据Axes.hist
新的控制器类。
> @theengineer:在上面的 #2 中,从每个获取更新是什么意思Artist
?
^ 是的。Controller
应该不需要更新。这只是发生在#3。当你看到这个时删除评论。
向后兼容性#
酸洗会改变
非仿射变换将需要定义的酸洗方法
替代方案#
PR #3150 建议通过将额外的容器寄生地附加到轴对象来添加语义。这是一个更完整的解决方案,应该是一个更发达/灵活/强大的框架。