MEP25:序列化#

状态#

已拒绝

这项工作很重要,但这项特殊的努力已经停滞.

分支和 Pull requests#

  • 开发分支:

  • 相关拉取请求:

摘要#

此 MEP 旨在添加可序列化的 Controller 对象,以充当 Artist 管理器.用户将通过 ControllerArtist 传达更改.通过这种方式,可以逐步添加 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 以打开

示例#

以下是控制器应该能够执行的一些示例.

  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. 从控制器管理 artist(例如,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. 创建能够管理 Artist 对象的基本 Controller 对象(例如, Hist )

    评论:

    • 初始化应该通过解包 ** 来完成,因此我们需要最终尝试控制的 Artist 的调用签名参数的副本.不幸的硬编码重复...

    • 每个 Artist 接受的额外 *kwargs 是否应该在 Controller 中跟踪?

    • Controller 如何知道哪个 artist 属于哪里?例如,我们需要传递 axes 引用吗?

    进度:

  2. 编写 Controller 更新模型的协议.

    评论:

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

    • 在 (1) 中的链接中,旧线被完全销毁并重新绘制,如果某些东西正在引用它会怎么样?

  3. 创建一种可以从 Controllers 组装 json 对象的方法

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

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

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

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

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

向后兼容性#

  • pickling 将会改变

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

替代方案#

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