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 Controller
objet sérialisable pour agir en tant que Artist
gestionnaire. Les utilisateurs communiqueraient ensuite les modifications à un
Artist
via un Controller
. De cette manière, les fonctionnalités des
Controller
objets peuvent être ajoutées progressivement puisque chacun
Artist
est 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 Artist
n'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'
Controller
objet gérant son ensemble d' Artist
objets.
Le Controller
doit être capable d'exporter les informations qu'il contient sur la figure sur commande, peut-être via une to_json
mé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
Controller
contiendra 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 aController
avec 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
Controller
objets de base capables de gérerArtist
des 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 leArtist
que nous essayons finalement de contrôler. Répétition codée en dur malheureuse...si le supplément
**kwargs
accepté par chacunArtist
doit être suivi auController
comment
Controller
savoir quel artiste appartient à quel endroit ? Par exemple, devons-nous passeraxes
des références ?
Progrès:
Un simple NB démontrant certaines fonctionnalités pour les
Line2DController
objets : 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
Controllers
Traiter 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.hist
etAxes.hist
en 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.