Dies wäre eine großartige Funktion, aber AFAIK ist nicht in Matplotlib implementiert und aufgrund der Art und Weise, wie Zahlen gespeichert werden, wahrscheinlich schwierig, sich selbst zu implementieren.
Ich würde vorschlagen, entweder (a) die Verarbeitung der Daten von der Generierung der Figur (die Daten mit einem eindeutigen Namen speichert) zu trennen und ein Skript zur Generierung der Figur (Laden einer bestimmten Datei der gespeicherten Daten) zu schreiben und nach Belieben zu bearbeiten oder (b ) als PDF / SVG / PostScript- Format speichern und in einem ausgefallenen Figureneditor wie Adobe Illustrator (oder Inkscape ) bearbeiten .
BEARBEITEN nach Herbst 2012 : Wie andere weiter unten betonten (obwohl dies hier als akzeptierte Antwort erwähnt wird), konnten Sie mit Matplotlib seit Version 1.2 Zahlen auswählen. Als Release Notes Zustand ist es eine experimentelle Funktion und bietet keine Unterstützung für eine Figur in einer matplotlib Version und Öffnung in einer anderen zu speichern. Es ist im Allgemeinen auch unsicher, eine Gurke aus einer nicht vertrauenswürdigen Quelle wiederherzustellen.
Für das Teilen / spätere Bearbeiten von Plots (die zuerst eine erhebliche Datenverarbeitung erfordern und möglicherweise Monate später angepasst werden müssen, z. B. während der Begutachtung für eine wissenschaftliche Veröffentlichung), empfehle ich weiterhin, dass der Workflow von (1) ein Datenverarbeitungsskript enthält, das vor dem Generieren eines Plots erstellt wird speichert die verarbeiteten Daten (die in Ihren Plot eingehen) in einer Datei und (2) verfügt über ein separates Plotgenerierungsskript (das Sie nach Bedarf anpassen), um den Plot neu zu erstellen. Auf diese Weise können Sie für jedes Diagramm schnell ein Skript ausführen und neu generieren (und Ihre Diagrammeinstellungen schnell mit neuen Daten kopieren). Das Beizen einer Figur könnte jedoch für die kurzfristige / interaktive / explorative Datenanalyse praktisch sein.
pickle
funktioniert jetzt mit MPL-Figuren, so dass dies möglich ist und vernünftig zu funktionieren scheint - fast wie eine Matlab-Figurendatei ".fig". In meiner Antwort unten (vorerst?) Finden Sie ein Beispiel dafür.Ich habe gerade herausgefunden, wie das geht. Die von @pelson erwähnte "experimentelle Gurkenunterstützung" funktioniert recht gut.
Versuche dies:
Speichern Sie das Figurenobjekt nach Ihrer interaktiven Optimierung als Binärdatei:
Öffnen Sie später die Abbildung und die Optimierungen sollten gespeichert werden und die GUI-Interaktivität sollte vorhanden sein:
Sie können sogar die Daten aus den Plots extrahieren:
(Es funktioniert für Linien, pcolor & imshow - pcolormesh arbeitet mit einigen Tricks, um die abgeflachten Daten zu rekonstruieren .)
Den hervorragenden Tipp habe ich beim Speichern von Matplotlib-Figuren mit Pickle erhalten .
quelle
pickle
, dass in der Dokumentation angegeben ist, dass wir die Umgebung ähnlich wieimport matplotlib.pyplot as plt
beim Einlegen (Speichern) des Objekts einrichten müssen, aber ich habe festgestellt, dass dies beim Entpicken (Laden) nicht erforderlich ist - die Importanweisungen werden in der eingelegten Datei gespeichert .with open('FigureObject.fig.pickle', 'rb') as file: figx = pickle.load(file)
figx.show()
, sollten Sieplt.show()
stattdessen aufrufen , was blockiert.Ab Matplotlib 1.2 haben wir jetzt experimentelle Pickle- Unterstützung. Probieren Sie es aus und sehen Sie, ob es für Ihren Fall gut funktioniert. Wenn Sie Probleme haben, teilen Sie uns dies bitte auf der Matplotlib-Mailingliste oder durch Öffnen eines Problems unter github.com/matplotlib/matplotlib mit .
quelle
PicklingError: Can't pickle <type '_macosx.GraphicsContext'>: it's not found as _macosx.GraphicsContext
.PicklingError
tritt nur auf, wenn Sieplt.show()
vor dem Beizen anrufen . So einfach legenplt.show()
nachpickle.dump()
.fig.show()
scheint die Reihenfolge von keine Rolle zu spielen - vielleicht wurde dieser Fehler behoben. Ich kann vorher / nachhershow()
ohne Probleme einlegen.Warum nicht einfach das Python-Skript senden? Für die .fig-Dateien von MATLAB muss der Empfänger über MATLAB verfügen, damit sie angezeigt werden können. Dies entspricht in etwa dem Senden eines Python-Skripts, für dessen Anzeige Matplotlib erforderlich ist.
Alternativ (Haftungsausschluss: Ich habe dies noch nicht versucht) können Sie versuchen, die Figur zu beizen:
quelle
MyPlot.fig.pickle
Datei speichern. So bleibt die spätere Möglichkeit erhalten, die Plotpräsentation nach Bedarf anzupassen. Dies ist auch das Tolle an Matlabs.fig
Dateien. Besonders nützlich, wenn Sie das Größen- / Seitenverhältnis einer Feige ändern müssen (zum Einfügen in Präsentationen / Papiere).Gute Frage. Hier ist der Dokumenttext von
pylab.save
:quelle
pylab.save
. Aus dem Dokumenttext geht hervor, dass man ihn nicht verwenden sollte.Ich fand einen relativ einfachen (aber etwas unkonventionellen) Weg, um meine Matplotlib-Figuren zu speichern. Es funktioniert so:
mit einer so
save_plot
definierten Funktion (einfache Version zum Verständnis der Logik):oder eine solche Funktion definieren
save_plot
(bessere Version mit Zip-Komprimierung, um leichtere Figurendateien zu erstellen):Hierfür wird ein
libscript
eigenes Modul verwendet , das hauptsächlich auf Moduleninspect
und basiertast
. Ich kann versuchen, es auf Github zu teilen, wenn Interesse geäußert wird (es würde zuerst eine Bereinigung erfordern und ich, um mit Github zu beginnen).Die Idee hinter dieser
save_plot
Funktion und diesemlibscript
Modul besteht darin, die Python-Anweisungen abzurufen, mit denen die Figur erstellt wird (mithilfe des Modulsinspect
), sie zu analysieren (mithilfe des Modulsast
), um alle Variablen, Funktionen und Module zu extrahieren, auf die sie sich verlassen, diese aus dem Ausführungskontext zu extrahieren und sie zu serialisieren als Python-Anweisungen (Code für Variablen ist wiet=[0.0,2.0,0.01]
... und Code für Module ist wieimport matplotlib.pyplot as plt
...) vor den Abbildungen. Die resultierenden Python-Anweisungen werden als Python-Skript gespeichert, dessen Ausführung die ursprüngliche Matplotlib-Figur neu erstellt.Wie Sie sich vorstellen können, funktioniert dies gut für die meisten (wenn nicht alle) Matplotlib-Figuren.
quelle