MEP25:序列化¶
摘要¶
此MEP旨在添加可序列化的 Controller
对象作为 Artist
管理者。然后,用户将更改传达给 Artist
通过A Controller
. 通过这种方式, Controller
由于每个对象 Artist
仍然负责绘制所有内容。其目标是创建一个API,该API可以通过绘制需要对图形进行高级描述的库和需要低级解释的库来使用。
详细描述¶
Matplotlib是一个核心绘图引擎,它具有许多用户已经了解的API。其他图形库很难/不可能(1)获得完整的图形描述,(2)根据用户提供的图形对象输出原始数据,(3)在没有启发式的情况下理解图形对象的语义,以及(4)为Matplotlib提供完整的图形描述以进行可视化。此外,因为 Artist
在图形中没有自己的语义概念,很难以自然的方式与它们进行交互。
在这个意义上,Matplotlib将采用标准的模型-视图-控制器(MVC)框架。这个 模型 将是用户定义的数据、样式和语义。这个 意见 是每个人的合奏吗 Artist
,负责生成基于 模型 . 这个 控制器 将是 Controller
对象管理其集合 Artist
物体。
这个 Controller
必须能够导出命令中关于图形的信息,可能通过 to_json
方法或类似方法。因为使用控制器复制模型中的所有信息是非常无关的,所以只显式保留用户指定的信息(数据+样式)。如果用户需要视图/模型中的更多信息(默认值),则应该能够查询该信息。
- 这可能很烦人,从rcparams对象中提取未指定的kwarg,而rcparms对象又是通过读取用户指定的文件创建的,并且可以在运行时动态更改。我想我们可以保留默认违约记录并与之进行比较。不清楚这将如何与样式表交互 [[MEP26] -塔卡斯韦尔
附加说明:
- “原始数据”不一定需要是
list
,ndarray
相反,它可以更抽象地拥有一种在需要时生成数据的方法。 - 因为
Controller
将包含用户可能不想保留的额外信息,它应该 not 默认情况下创建。您应该能够同时(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)
实施¶
创建基地
Controller
能够管理的对象Artist
对象(例如,Hist
)评论:
- 初始化应该通过解包进行
**
,因此我们需要一个调用签名参数的副本Artist
我们最终想要控制。不幸的硬编码重复… - 如果附加的
**kwargs
每个人都接受Artist
在Controller
- 如何做
Controller
知道哪位艺术家属于哪里?例如,我们需要通过吗axes
参考文献?
进展:
- 一个简单的NB演示了
Line2DController
对象:https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
- 初始化应该通过解包进行
的写入协议
Controller
到 更新 模型。评论:
- 如何处理集装箱?例如,当我们对一个柱状图重新进行存储时,旧的补丁会发生什么情况?
- 在(1)的链接中,旧行被完全破坏并重新绘制,如果有什么东西引用它呢?
创建方法,通过该方法可以从
Controllers
处理一个图形的不可序列化方面(例如,非仿射变换?)
能够从序列化表示中实例化
重新实现现有的Pyplot和Axes方法,例如
pyplot.hist
和Axes.hist
关于新的控制器类。
>@工程师:在上面的2中,你的意思是什么? 获取更新 从每个 Artist
是吗?
是的。这个 Controller
不应该 需要更新。这只发生在3。看到此内容时删除注释。