MEP25 : Numéro de sérialisation

Statut #

Rejeté

Ce travail est important, mais cet effort particulier est au point mort.

Branches et demandes d'extraction #

  • branches de développement :

  • demandes d'extraction associées :

Résumé #

Ce MEP vise à ajouter un Controllerobjet sérialisable pour agir en tant que Artistgestionnaire. Les utilisateurs communiqueraient ensuite les modifications à un Artistvia un Controller. De cette manière, les fonctionnalités des Controllerobjets peuvent être ajoutées progressivement puisque chacun Artistest toujours responsable de tout dessiner. L'objectif est de créer une API utilisable à la fois par des bibliothèques graphiques nécessitant des descriptions de haut niveau des figures et des bibliothèques nécessitant des interprétations de bas niveau.

Descriptif détaillé #

Matplotlib est un moteur de traçage de base avec une API que de nombreux utilisateurs comprennent déjà. Il est difficile/impossible pour d'autres bibliothèques graphiques de (1) obtenir une description complète de la figure, (2) générer des données brutes à partir de l'objet figure tel que l'utilisateur l'a fourni, (3) comprendre la sémantique des objets figure sans heuristique, et ( 4) donnez à matplotlib une description complète de la figure à visualiser. De plus, parce qu'un Artistn'a aucune conception de sa propre sémantique au sein de la figure, il est difficile d'interagir avec eux de manière naturelle.

En ce sens, matplotlib adoptera un framework standard Model-View-Controller (MVC). Le modèle sera les données, le style et la sémantique définis par l'utilisateur. Les Vues sont l'ensemble de chaque individu Artist, qui est chargé de produire l'image finale basée sur le modèle . Le Controller sera l' Controllerobjet gérant son ensemble d' Artistobjets.

Le Controllerdoit être capable d'exporter les informations qu'il contient sur la figure sur commande, peut-être via une to_jsonméthode ou similaire. Comme il serait extrêmement superflu de dupliquer toutes les informations du modèle avec le contrôleur, seules les informations spécifiées par l'utilisateur (données + style) sont explicitement conservées. Si un utilisateur souhaite plus d'informations (valeurs par défaut) à partir de la vue/du modèle, il doit pouvoir les interroger.

  • Cela peut être ennuyeux à faire, les kwargs non spécifiés sont extraits de l'objet rcParams qui est à son tour créé à partir de la lecture d'un fichier spécifié par l'utilisateur et peut être modifié dynamiquement au moment de l'exécution. Je suppose que nous pourrions garder un dict des défauts par défaut et comparer avec cela. Pas clair comment cela va interagir avec la feuille de style [[MEP26]] - @tacaswell

Notes complémentaires:

  • Les "données brutes" n'ont pas nécessairement besoin d'être un list, ndarray, etc. Au contraire, elles peuvent simplement avoir une méthode plus abstraite pour produire des données en cas de besoin.

  • Étant donné que le Controllercontiendra des informations supplémentaires que les utilisateurs ne voudront peut-être pas conserver, il ne doit pas être créé par défaut. Vous devriez pouvoir à la fois (a) instancier a Controller avec une figure et (b) construire une figure avec a Controller.

Cas d'utilisation :

  • Exportez toutes les informations nécessaires

  • Sérialiser une figure matplotlib, l'enregistrer et pouvoir la réexécuter plus tard.

  • Toute autre source envoyant une représentation formatée de manière appropriée à matplotlib pour ouvrir

Exemples #

Voici quelques exemples de ce que les contrôleurs devraient être capables de faire.

  1. Instanciez une figure matplotlib à partir d'une représentation sérialisée (par exemple, JSON) :

    import json
    from matplotlib.controllers import Controller
    with open('my_figure') as f:
        o = json.load(f)
    c = Controller(o)
    fig = c.figure
    
  2. Gérer les artistes depuis le contrôleur (par exemple, Line2D) :

    # not really sure how this should look
    c.axes[0].lines[0].color = 'b'
    # ?
    
  3. Exporter la représentation de la figure sérialisable :

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

Mise en œuvre #

  1. Créer des Controllerobjets de base capables de gérer Artistdes objets (par exemple, Hist)

    Commentaires:

    • l' initialisation devrait se produire via unpacking **, nous avons donc besoin d'une copie du paramètre de signature d'appel pour le Artistque nous essayons finalement de contrôler. Répétition codée en dur malheureuse...

    • si le supplément **kwargsaccepté par chacun Artist doit être suivi auController

    • comment Controllersavoir quel artiste appartient à quel endroit ? Par exemple, devons-nous passer axesdes références ?

    Progrès:

  2. Rédigez des protocoles pour mettre Controllerà jour le modèle.

    Commentaires:

    • comment traiter les conteneurs ? Par exemple, qu'arrive-t-il aux anciens correctifs lorsque nous redéfinissons un histogramme ?

    • dans le lien de (1), l'ancienne ligne est complètement détruite et redessinée, et si quelque chose y fait référence ?

  3. Créer une méthode par laquelle un objet json peut être assemblé à partir du Controllers

  4. Traiter de la sérialisation des aspects non sérialisables d'une figure (par exemple, des transformations non affines ?)

  5. Pouvoir instancier à partir d'une représentation sérialisée

  6. Réimplémentez la méthode pyplot et Axes existante, par exemple pyplot.histet Axes.histen termes de la nouvelle classe de contrôleur.

> @theengineer : dans le point 2 ci-dessus, qu'entendez-vous par obtenir des mises à jour de chacunArtist ?

^ Ouais. Le Controller ne devrait pas avoir besoin d'être mis à jour. Cela se produit juste dans #3. Supprimez les commentaires lorsque vous voyez cela.

Rétrocompatibilité #

  • le décapage va changer

  • les transformations non affines nécessiteront une méthode de décapage définie

Alternatives #

PR #3150 a suggéré d'ajouter de la sémantique en attachant de manière parasite des conteneurs supplémentaires aux objets axes. Il s'agit d'une solution plus complète avec ce qui devrait être un cadre plus développé/flexible/puissant.