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 发送适当格式的表示以打开

例子#

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

  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

    注释:

    • 初始化应该通过 unpacking 进行**,所以我们需要一个调用签名参数的副本,以便我们Artist最终尝试控制。不幸的硬编码重复......

    • **kwargs每个人接受的额外费用是否应该ArtistController

    • 怎么Controller知道哪个艺术家属于哪里?例如,我们需要传递axes引用吗?

    进步:

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

    注释:

    • 容器应该如何处理?例如,当我们重新划分直方图时,旧补丁会发生什么情况?

    • 在(1)的链接中,旧线被完全破坏并重新绘制,如果有东西引用它怎么办?

  3. 创建方法,通过该方法可以从 Controllers

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

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

  6. 重新实现现有的 pyplot 和 Axes 方法,例如pyplot.hist根据Axes.hist新的控制器类。

> @theengineer:在上面的 #2 中,从每个获取更新是什么意思Artist

^ 是的。Controller 应该不需要更新。这只是发生在#3。当你看到这个时删除评论。

向后兼容性#

  • 酸洗会改变

  • 非仿射变换将需要定义的酸洗方法

替代方案#

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