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 aControlleravec une figure et (b) construire une figure avec aController.
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.
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
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' # ?
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 #
Créer des
Controllerobjets de base capables de gérerArtistdes 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 leArtistque nous essayons finalement de contrôler. Répétition codée en dur malheureuse...si le supplément
**kwargsaccepté par chacunArtistdoit être suivi auControllercomment
Controllersavoir quel artiste appartient à quel endroit ? Par exemple, devons-nous passeraxesdes références ?
Progrès:
Un simple NB démontrant certaines fonctionnalités pour les
Line2DControllerobjets : https://nbviewer.jupyter.org/gist/theengineear/f0aa8d79f64325e767c0
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 ?
Créer une méthode par laquelle un objet json peut être assemblé à partir du
ControllersTraiter de la sérialisation des aspects non sérialisables d'une figure (par exemple, des transformations non affines ?)
Pouvoir instancier à partir d'une représentation sérialisée
Réimplémentez la méthode pyplot et Axes existante, par exemple
pyplot.histetAxes.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.