MEP25:序列化

状态

Rejected

这项工作很重要,但这项特别的努力已经停滞不前。

分支和请求

  • 开发分部:
  • 相关请求:

摘要

此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] -塔卡斯韦尔

附加说明:

  • “原始数据”不一定需要是 listndarray 相反,它可以更抽象地拥有一种在需要时生成数据的方法。
  • 因为 Controller 将包含用户可能不想保留的额外信息,它应该 not 默认情况下创建。您应该能够同时(a)实例化 Controller 用图形和(b)用 Controller .

用例:

  • 导出所有必需的信息
  • 序列化matplotlib图,保存它,并能够稍后重新运行。
  • 向matplotlib发送适当格式的表示以打开的任何其他源

实例

下面是一些控制器应该能够做什么的例子。

  1. 从序列化表示(例如,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
    
  2. 从控制器管理艺术家(例如,line2d)::

    # not really sure how this should look
    c.axes[0].lines[0].color = 'b'
    # ?
    
  3. 导出可序列化的图形表示形式:::

    o = c.to_json()
    # or... we should be able to throw a figure object in there too
    o = Controller.to_json(mpl_fig)
    

实施

  1. 创建基地 Controller 能够管理的对象 Artist 对象(例如, Hist

    评论:

    • 初始化应该通过解包进行 ** ,因此我们需要一个调用签名参数的副本 Artist 我们最终想要控制。不幸的硬编码重复…
    • 如果附加的 **kwargs 每个人都接受 ArtistController
    • 如何做 Controller 知道哪位艺术家属于哪里?例如,我们需要通过吗 axes 参考文献?

    进展:

  2. 的写入协议 Controller更新 模型。

    评论:

    • 如何处理集装箱?例如,当我们对一个柱状图重新进行存储时,旧的补丁会发生什么情况?
    • 在(1)的链接中,旧行被完全破坏并重新绘制,如果有什么东西引用它呢?
  3. 创建方法,通过该方法可以从 Controllers

  4. 处理一个图形的不可序列化方面(例如,非仿射变换?)

  5. 能够从序列化表示中实例化

  6. 重新实现现有的Pyplot和Axes方法,例如 pyplot.histAxes.hist 关于新的控制器类。

>@工程师:在上面的2中,你的意思是什么? 获取更新 从每个 Artist 是吗?

是的。这个 Controller 不应该 需要更新。这只发生在3。看到此内容时删除注释。

向后兼容性

  • 酸洗会改变
  • 非仿射变换需要定义的酸洗方法。

选择

pr 3150建议通过将额外容器寄生地附加到axs对象来添加语义。这是一个更完整的解决方案,应该是一个更为开发/灵活/强大的框架。