MEP25: シリアライゼーション#

ステータス番号

却下

この作業は重要ですが、この特定の取り組みは停滞しています。

ブランチとプルリクエスト#

  • 開発ブランチ:

  • 関連するプル リクエスト:

アブストラクト#

この MEP は、マネージャーControllerとして機能するシリアル化可能なオブジェクトを追加することを目的としています。ユーザーは、経由で にArtist変更を通知 します。このように、オブジェクトの機能は、 それぞれがすべてを描画する責任があるため、段階的に追加でき ます。目標は、図の高レベルの記述を必要とするグラフ ライブラリと低レベルの解釈を必要とするライブラリの両方で使用できる API を作成することです。ArtistControllerControllerArtist

詳細な説明#

Matplotlib は、多くのユーザーが既に理解している API を備えたコア プロット エンジンです。他のグラフ作成ライブラリでは、(1) 完全な図の記述を取得すること、(2) ユーザーが提供したとおりに図オブジェクトから生データを出力すること、(3) ヒューリスティックを使用せずに図オブジェクトのセマンティクスを理解すること、および ( 4)視覚化するための完全な図の説明をmatplotlibに与えます。また、Artist図の中で an 自身のセマンティクスの概念がないため、自然な方法でそれらとやり取りすることは困難です。

この意味で、matplotlib は標準の Model-View-Controller (MVC) フレームワークを採用します。モデルは、ユーザー定義のデータ、スタイル、およびセマンティクスになります。ビューは、モデルArtistに基づいて最終的なイメージを作成する役割を担う各個人の集合体です。Controllerは 、一連のオブジェクトを管理するオブジェクトになります。ControllerArtist

は、おそらくメソッドまたは同様の方法Controllerを介して、コマンドでフィギュアについて運んでいる情報をエクスポートできなければなりません。to_jsonモデル内のすべての情報をコントローラーで複製することは非常に無関係であるため、ユーザー指定の情報 (データ + スタイル) のみが明示的に保持されます。ユーザーがビュー/モデルからより多くの情報 (デフォルト) を必要とする場合は、クエリを実行できる必要があります。

  • 指定されていない kwargs は、ユーザーが指定したファイルを読み取って作成され、実行時に動的に変更できる rcParams オブジェクトから取得されます。デフォルトのデフォルトの口述を保持し、それと比較できると思います。これがスタイル シート [[MEP26]] とどのように相互作用するかは不明 - @tacaswell

その他の注意事項:

  • list「生データ」は、必ずしも、 などである必要はありませんndarray。むしろ、必要なときにデータを生成する方法をより抽象的に持つことができます。

  • Controllerには、ユーザーが保持したくない追加情報が含まれているため、既定では作成しないでください。Controller (a) Figure を使用して をインスタンス化し、(b) を使用して Figure を作成することができる必要がありますController

使用例:

  • 必要なすべての情報をエクスポートする

  • matplotlib の Figure をシリアル化して保存し、後で再実行できるようにする。

  • 適切にフォーマットされた表現を matplotlib に送信して開くその他のソース

#

以下は、コントローラーができるべきことの例です。

  1. シリアル化された表現 (JSON など) から matplotlib Figure をインスタンス化します。

    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. シリアル化可能な Figure 表現をエクスポートします。

    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それぞれによって受け入れられた追加Artist がで追跡される必要がありますController

    • どのControllerアーティストがどこに属しているかをどうやって知るのですか? たとえば、参照を渡す必要がありaxesますか?

    進捗:

  2. がモデルController更新するためのプロトコルを記述します。

    コメント:

    • コンテナはどのように扱われるべきですか?たとえば、ヒストグラムを再ビン化すると、古いパッチはどうなりますか?

    • (1) のリンクでは、古い行が完全に破棄されて再描画されていますが、何かがそれを参照している場合はどうなりますか?

  3. からjsonオブジェクトを組み立てるCreateメソッド Controllers

  4. Figure のシリアル化できない側面のシリアル化を処理します (たとえば、非アフィン変換?)

  5. シリアル化された表現からインスタンス化できる

  6. 既存の pyplot および Axes メソッドを再実装します (たとえばpyplot.histAxes.hist新しいコントローラー クラスに関して)。

> @theengineer: 上記の #2 で、それぞれから更新を取得するとはどういう意味Artistですか?

^ うん。を更新する必要はありController ません。これは#3で発生します。これを見たらコメントを削除してください。

下位互換性#

  • 漬け物が変わる

  • 非アフィン変換には、定義された酸洗い方法が必要です

代替案#

PR #3150 では、余分なコンテナーを軸オブジェクトに寄生的にアタッチすることにより、セマンティクスを追加することが提案されました。これは、より開発された、柔軟で強力なフレームワークであるべきものを備えた、より完全なソリューションです。