Ich schreibe ein schnelles und schmutziges Skript, um Handlungen im laufenden Betrieb zu erstellen. Ich verwende den folgenden Code (aus der Matplotlib- Dokumentation) als Ausgangspunkt:
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
Ich möchte den Plot nicht auf einer GUI anzeigen, sondern den Plot in einer Datei (z. B. foo.png) speichern, damit er beispielsweise in Batch-Skripten verwendet werden kann. Wie mache ich das?
python
matplotlib
plot
Homunculus Reticulli
quelle
quelle
savefig
Methode. So können Sie rufenfig = plt.figure()
dannfig.savefig(...)
.plt.close(fig)
was besonders bei großen Schleifen wichtig ist. Andernfalls bleiben die Figuren offen und warten im Speicher und alle offenen Figuren werden bei der Ausführungplt.show()
Antworten:
Während die Frage beantwortet wurde, möchte ich einige nützliche Tipps zur Verwendung von matplotlib.pyplot.savefig hinzufügen . Das Dateiformat kann durch die Erweiterung angegeben werden:
Gibt eine gerasterte bzw. vektorisierte Ausgabe, die beide nützlich sein könnten. Darüber hinaus werden Sie feststellen, dass
pylab
ein großzügiges, oft unerwünschtes Leerzeichen um das Bild herum verbleibt. Entfernen Sie es mit:quelle
plt.savefig
Sie können die dpi ändern, siehe den Link in der Antwort. Die Abmessungen können beim Erstellen der Figur gesteuert werden, siehefigsize
in matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
wodurch die Interaktivität inmatplotlib.pyplot
Befehlen deaktiviert werden soll.foo.png
ist der Pfad. Sie können es beispielsweise in ein solches Verzeichnis einfügensavefig("mydir/foo.png")
.Wie andere gesagt haben,
plt.savefig()
oderfig1.savefig()
ist in der Tat der Weg, um ein Bild zu speichern.Ich habe jedoch festgestellt, dass in bestimmten Fällen die Abbildung immer angezeigt wird . (z. B. mit Spyder mit
plt.ion()
: Interaktiver Modus = Ein.) Um dieses Problem zu umgehen, erzwinge ich das Schließen des Figurenfensters in meiner Riesenschleife mitplt.close(figure_object)
(siehe Dokumentation ), sodass ich während der Schleife keine Million offener Figuren habe:Sie sollten in der Lage sein, die Figur später bei Bedarf wieder zu öffnen
fig.show()
(habe mich nicht getestet).quelle
plt.ioff() # turn of interactive plotting mode
, aber dies kann das Verhalten deaktivieren, das Sie verwenden möchten, wenn Ihr Code mit einem Fehler beendet wird.plt.close(fig)
löste esDie Lösung ist:
quelle
Ich habe gerade diesen Link in der MatPlotLib-Dokumentation gefunden, der genau dieses Problem behebt: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Sie sagen, dass der einfachste Weg, um das Auftauchen der Figur zu verhindern, die Verwendung eines nicht interaktiven Backends (z. B. Agg) ist, z.
matplotib.use(<backend>)
B.:Ich persönlich bevorzuge immer noch die Verwendung
plt.close( fig )
, da Sie seitdem die Möglichkeit haben, bestimmte Zahlen (während einer Schleife) auszublenden, aber immer noch Zahlen für die Datenverarbeitung nach der Schleife anzuzeigen. Es ist wahrscheinlich langsamer als die Auswahl eines nicht interaktiven Backends - wäre interessant, wenn jemand das testen würde.UPDATE : Für Spyder können Sie das Backend normalerweise nicht auf diese Weise einstellen (da Spyder Matplotlib normalerweise frühzeitig lädt und Sie daran hindert, es zu verwenden
matplotlib.use()
).Verwenden
plt.switch_backend('Agg')
oder deaktivieren Sie stattdessen " Support aktivieren " in den Spyder-Einstellungen und führen Sie denmatplotlib.use('Agg')
Befehl selbst aus.Aus diesen beiden Hinweisen: eins , zwei
quelle
.plot()
wird ein Fehler ausgegeben, wennos.environ['DISPLAY']
es nicht richtig eingestellt ist.Wenn Ihnen das Konzept der "aktuellen" Figur nicht gefällt, gehen Sie wie folgt vor:
quelle
src.png
nachout.png
?img
) in einer Datei mit der.imsave()
Methode speichern können, wenn Sie es haben .Die anderen Antworten sind richtig. Manchmal stelle ich jedoch fest, dass ich das Figurenobjekt später öffnen möchte . Beispielsweise möchte ich möglicherweise die Etikettengrößen ändern, ein Raster hinzufügen oder eine andere Verarbeitung durchführen. In einer perfekten Welt würde ich einfach den Code, der den Plot generiert, erneut ausführen und die Einstellungen anpassen. Leider ist die Welt nicht perfekt. Daher füge ich zusätzlich zum Speichern in PDF oder PNG Folgendes hinzu:
So kann ich später das Figurenobjekt laden und die Einstellungen nach Belieben bearbeiten.
Ich schreibe auch den Stapel mit dem Quellcode und dem
locals()
Wörterbuch für jede Funktion / Methode im Stapel aus, damit ich später genau sagen kann, was die Figur erzeugt hat.NB: Seien Sie vorsichtig, da diese Methode manchmal große Dateien generiert.
quelle
quelle
Nachdem Sie mit plot () und anderen Funktionen den gewünschten Inhalt erstellt haben, können Sie mit einer solchen Klausel zwischen dem Plotten auf dem Bildschirm oder der Datei wählen:
quelle
fig = plt.figure(figuresize=4, 5)
könnte seinfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
Ich habe folgendes verwendet:
Ich fand es sehr wichtig, plt.show nach dem Speichern der Figur zu verwenden, sonst funktioniert es nicht. Abbildung in PNG exportiert
quelle
f= plt.savefig('data.png')
Sie können entweder:
und denken Sie daran, savefig beenden zu lassen, bevor Sie das GUI-Diagramm schließen. Auf diese Weise können Sie das Bild vorher sehen.
Alternativ kann man es auch dreht mit
plt.show()
Schließen Sie dann die GUI und das Skript erneut aus , diesmal aber ersetzenplt.show()
mitplt.savefig()
.Alternativ können Sie verwenden
quelle
Wenn Sie wie ich Spyder IDE verwenden, müssen Sie den interaktiven Modus deaktivieren mit:
plt.ioff()
(Dieser Befehl wird automatisch mit dem wissenschaftlichen Start gestartet.)
Wenn Sie es erneut aktivieren möchten, verwenden Sie:
plt.ion()
quelle
Die Lösung :
Wenn Sie das Bild anzeigen und speichern möchten, verwenden Sie:
nach
import matplotlib
quelle
Laut Frage gibt Matplotlib (Pyplot) savefig ein leeres Bild aus .
Eine Sache sollte beachtet werden: Wenn Sie verwenden
plt.show
und es sollte nachplt.savefig
, oder Sie werden ein leeres Bild geben.Ein detailliertes Beispiel:
quelle
In Jupyter Notebook müssen Sie zusammen mit dem Rest des plt-Codes in einer Zelle entfernen
plt.show()
und hinzufügenplt.savefig()
. Das Bild wird weiterhin in Ihrem Notizbuch angezeigt.quelle
Da heute (nicht verfügbar war , wenn diese Frage gestellt wurde) viele Leute verwenden Jupyter Notebook als Python - Konsole gibt eine äußerst einfache Möglichkeit ist es, die Grundstücke zu speichern ,
.png
die, nur nennenmatplotlib
‚spylab
Klasse von Jupyter Notebook, zeichnet die Figur‘ inline 'jupyter Zellen, und ziehen Sie dann diese Figur / Bild in ein lokales Verzeichnis. Vergessen Sie nicht%matplotlib inline
in der ersten Zeile!quelle
Zusätzlich zu den oben genannten habe ich
__file__
den Namen hinzugefügt, damit das Bild und die Python-Datei dieselben Namen erhalten. Ich habe auch einige Argumente hinzugefügt, damit es besser aussieht:quelle
Bei der Verwendung
matplotlib.pyplot
müssen Sie zuerst Ihr Diagramm speichern und es dann mit den folgenden 2 Zeilen schließen:quelle
Wie bereits vorgeschlagen, können Sie entweder Folgendes verwenden:
Zum Speichern des angezeigten IPhython-Bildes. Oder aus einem anderen Blickwinkel (aus einem anderen Blickwinkel), wenn Sie jemals mit Open CV arbeiten oder Open CV importiert haben, können Sie sich für Folgendes entscheiden:
cv2 importieren
cv2.imwrite ("myfig.png", Bild)
Dies ist jedoch nur für den Fall, dass Sie mit Open CV arbeiten müssen. Andernfalls sollte plt.savefig () ausreichend sein.
quelle
Sie können Ihr Bild mit einer beliebigen Erweiterung (PNG, JPG usw.) Und mit der gewünschten Auflösung speichern. Hier ist eine Funktion zum Speichern Ihrer Figur.
'fig_id' ist der Name, unter dem Sie Ihre Figur speichern möchten. Ich hoffe es hilft:)
quelle
Sie können es so machen:
quelle