Ce serait une fonctionnalité intéressante, mais AFAIK n'est pas implémentée dans Matplotlib et serait probablement difficile à implémenter vous-même en raison de la façon dont les chiffres sont stockés.
Je suggérerais soit (a) de séparer le traitement des données de la génération de la figure (qui enregistre les données avec un nom unique) et d'écrire un script de génération de figure (charger un fichier spécifié des données enregistrées) et de le modifier comme bon vous semble ou (b ) enregistrez au format PDF / SVG / PostScript et modifiez-les dans un éditeur de figures sophistiqué comme Adobe Illustrator (ou Inkscape ).
EDIT post Automne 2012 : Comme d'autres l'ont souligné ci-dessous (bien que mentionnant ici car c'est la réponse acceptée), Matplotlib depuis la version 1.2 vous a permis de décaper les chiffres. Comme l' indiquent les notes de publication , il s'agit d'une fonctionnalité expérimentale et ne prend pas en charge l'enregistrement d'une figure dans une version de matplotlib et son ouverture dans une autre. Il est également généralement peu sûr de restaurer un cornichon à partir d'une source non fiable.
Pour le partage / l'édition ultérieure des parcelles (qui nécessitent d'abord un traitement de données important et peuvent devoir être peaufinées des mois plus tard, par exemple lors de l'examen par les pairs pour une publication scientifique), je recommande toujours le flux de travail de (1) avoir un script de traitement de données qui avant de générer un graphique enregistre les données traitées (qui vont dans votre tracé) dans un fichier, et (2) ont un script de génération de tracé séparé (que vous ajustez si nécessaire) pour recréer le tracé. De cette façon, pour chaque tracé, vous pouvez rapidement exécuter un script et le régénérer (et copier rapidement les paramètres de votre tracé avec de nouvelles données). Cela dit, le décapage d'une figure peut être pratique pour une analyse de données à court terme / interactive / exploratoire.
pickle
fonctionne maintenant sur les figures MPL, donc cela peut être fait et semble fonctionner raisonnablement bien - presque comme un fichier de figures Matlab ".fig". Voir ma réponse ci-dessous (pour le moment?) Pour un exemple de la façon de le faire.Je viens de découvrir comment faire cela. Le "support de cornichon expérimental" mentionné par @pelson fonctionne assez bien.
Essaye ça:
Après votre peaufinage interactif, enregistrez l'objet figure sous forme de fichier binaire:
Plus tard, ouvrez la figure et les modifications doivent être enregistrées et l'interactivité de l'interface graphique doit être présente:
Vous pouvez même extraire les données des tracés:
(Cela fonctionne pour les lignes, pcolor et imshow - pcolormesh fonctionne avec quelques astuces pour reconstruire les données aplaties .)
J'ai eu l'excellent conseil de Saving Matplotlib Figures Using Pickle .
la source
pickle
documentation indiquait que nous devions configurer l'environnement de la même manière que lorsque l'objet était pickled (enregistré), mais j'ai trouvé que vous n'en avez pas besoinimport matplotlib.pyplot as plt
lors du décapage (chargement) - il enregistre les instructions d'importation dans le fichier pickled .with open('FigureObject.fig.pickle', 'rb') as file: figx = pickle.load(file)
figx.show()
, vous devez appeler à laplt.show()
place, ce qui bloque.Depuis Matplotlib 1.2, nous avons maintenant un support expérimental de pickle . Essayez-le et voyez si cela fonctionne bien pour votre cas. Si vous rencontrez des problèmes, veuillez nous en informer sur la liste de diffusion Matplotlib ou en ouvrant un numéro sur github.com/matplotlib/matplotlib .
la source
PicklingError: Can't pickle <type '_macosx.GraphicsContext'>: it's not found as _macosx.GraphicsContext
.PicklingError
ne se produit que si vous appelezplt.show()
avant de faire le cornichon. Alors placez justeplt.show()
aprèspickle.dump()
.fig.show()
ne semble pas avoir d'importance - peut-être que ce bogue a été corrigé. Je peux décaper avant / aprèsshow()
sans problème.Pourquoi ne pas simplement envoyer le script Python? Les fichiers .fig de MATLAB nécessitent que le destinataire dispose de MATLAB pour les afficher, c'est donc à peu près équivalent à l'envoi d'un script Python qui nécessite l'affichage de Matplotlib.
Alternativement (avertissement: je n'ai pas encore essayé cela), vous pouvez essayer de décaper la figure:
la source
MyPlot.fig.pickle
fichier - en conservant la possibilité ultérieure d'ajuster la présentation du tracé si nécessaire. C'est aussi ce qui est génial avec les.fig
fichiers Matlab . Particulièrement utile lorsque vous devez modifier le rapport taille / format d'une figue (pour l'insertion dans des présentations / papiers).Bonne question. Voici le texte du doc de
pylab.save
:la source
pylab.save
. En fait, d'après le texte du doc, il semble qu'il ne faut pas l' utiliser.J'ai trouvé un moyen relativement simple (mais un peu non conventionnel) de sauvegarder mes figurines matplotlib. Cela fonctionne comme ceci:
avec la fonction
save_plot
définie comme ceci (version simple pour comprendre la logique):ou définir une fonction
save_plot
comme celle-ci (meilleure version utilisant la compression zip pour produire des fichiers de figures plus légers):Cela utilise
libscript
mon propre module , qui repose principalement sur des modulesinspect
etast
. Je peux essayer de le partager sur Github si un intérêt est exprimé (cela nécessiterait d'abord un nettoyage et moi pour commencer avec Github).L'idée derrière cette
save_plot
fonction et celibscript
module est de récupérer les instructions python qui créent la figure (en utilisant le moduleinspect
), de les analyser (en utilisant le moduleast
) pour extraire toutes les variables, fonctions et modules sur lesquels il s'appuie, les extraire du contexte d'exécution et les sérialiser comme instructions python (le code pour les variables sera commet=[0.0,2.0,0.01]
... et le code pour les modules sera commeimport matplotlib.pyplot as plt
...) ajouté aux instructions de la figure. Les instructions python résultantes sont enregistrées en tant que script python dont l'exécution reconstruira la figure originale de matplotlib.Comme vous pouvez l'imaginer, cela fonctionne bien pour la plupart (sinon tous) des figures matplotlib.
la source