Dies zeigt die Figur in einer GUI an:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()
Aber wie speichere ich die Figur stattdessen in eine Datei (zB foo.png)?
Homunculus Reticulli
Dies zeigt die Figur in einer GUI an:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()
Aber wie speichere ich die Figur stattdessen in eine Datei (zB foo.png)?
Süchtig
Beim Benutzen matplotlib.pyplot.savefig
das Dateiformat kann durch die Erweiterung angegeben werden:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
Das ergibt eine gerasterte bzw. vektorisierte Ausgabe. Außerdem gibt es manchmal unerwünschte Leerzeichen um das Bild herum, die entfernt werden können mit:
plt.savefig('foo.png', bbox_inches="tight")
Beachten Sie, dass beim Anzeigen des Diagramms plt.show()
sollte folgen plt.savefig()
; andernfalls ist das Dateibild leer.
Kann jemand erklären, warum das Anzeigen vor dem Speichern zu einem gespeicherten leeren Bild führt?
– SilentCloud
8. März 2022 um 15:25 Uhr
Der @SilentCloud-Aufruf von show() löscht den Plot. Sie müssen es vorher speichern, aber es gibt auch andere Optionen dafür.
– Trinity420
13. April 2022 um 10:50 Uhr
Für Jupyter Notebook müssen sich plt.plot(data) und plt.savefig(‘foo.png’) in derselben Zelle befinden. Wenn nicht, sehen Sie eine leere Datei.
– Punnerud
13. Oktober 2022 um 11:19 Uhr
Demis
Wie andere gesagt haben, plt.savefig()
oder fig1.savefig()
ist in der Tat der Weg, um ein Bild zu speichern.
Allerdings habe ich das in bestimmten Fällen gefunden Die Figur wird immer angezeigt. (z.B. bei Spyder mit plt.ion()
: interaktiver Modus = Ein.) Ich umgehe dies, indem ich das Schließen des Figurenfensters erzwinge mit:
plt.close(figure_object)
(sehen Dokumentation). Auf diese Weise habe ich während einer großen Schleife keine Millionen offener Zahlen. Beispielnutzung:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
Sie sollten die Abbildung später bei Bedarf wieder öffnen können fig.show()
(nicht selbst getestet).
Beachten Sie, dass die Namen ax
/fig
/plt
sind zusammengesetzte Variablennamen – nennen Sie sie, wie Sie wollen. In beiden Fällen enthalten sie Objekte. Sie können sehen, welche Objekte subplots
kehrt hier zurück: matplotlib.org/3.2.1/api/_as_gen/… und was die pyplot
Modul ist hier: matplotlib.org/tutorials/introductory/pyplot.html .
– Demis
28. Juni 2020 um 22:45 Uhr
Lukasz Czerwinski
Die Lösung ist:
pylab.savefig('foo.png')
pylab ist nicht definiert
– Benutzer14349917
6. Januar 2021 um 3:42 Uhr
Demis
Habe gerade diesen Link in der MatPlotLib-Dokumentation gefunden, der genau dieses Problem anspricht:
http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Sie sagen, dass der einfachste Weg, um zu verhindern, dass die Zahl auftaucht, darin besteht, ein nicht interaktives Backend (z. B. Agg) zu verwenden, via matplotib.use(<backend>)
z.B:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Ich persönlich bevorzuge immer noch die Verwendung plt.close( fig )
, seitdem haben Sie die Möglichkeit, bestimmte Zahlen (während einer Schleife) auszublenden, aber Zahlen für die Datenverarbeitung nach der Schleife anzuzeigen. Es ist wahrscheinlich langsamer als die Wahl eines nicht interaktiven Backends – wäre interessant, wenn jemand das testen würde.
AKTUALISIEREN: für Spyder können Sie das Backend normalerweise nicht auf diese Weise einstellen (da Spyder matplotlib normalerweise früh lädt und Sie daran hindert, matplotlib.use()
).
Verwenden Sie stattdessen plt.switch_backend('Agg')
oder Ausschalten “Unterstützung aktivieren” in den Spyder-Einstellungen und führen Sie die matplotlib.use('Agg')
kommandiere dich.
Aus diesen zwei Hinweisen: eins, zwei
Wunder.Mäuse
Wenn Ihnen das Konzept der “aktuellen” Figur nicht gefällt, tun Sie Folgendes:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
Kopiert das nicht nur src.png
Zu out.png
?
– Gerrit
26. Mai 2016 um 11:44 Uhr
Das ist nur ein Beispiel, das zeigt, ob Sie ein Bildobjekt haben (img
), dann können Sie es mit in einer Datei speichern .imsave()
Methode.
– Wunder.Mäuse
26. Mai 2016 um 23:29 Uhr
@wonder.mice würde helfen zu zeigen, wie man ein Bild erstellt, ohne die aktuelle Figur zu verwenden.
– hellseherisch
10. August 2016 um 6:50 Uhr
@wonder.mice Danke für dieses Beispiel, es ist das erste, das mir gezeigt hat, wie man ein Bildobjekt in .png speichert.
– Arthur Dent
24. Mai 2017 um 21:09 Uhr
@scry Sie müssen nicht immer ein Bild erstellen, manchmal probieren Sie Code aus und möchten eine visuelle Ausgabe, in solchen Fällen ist es praktisch.
– Schütze
13. Februar 2019 um 15:08 Uhr
Viktor Julia
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
plt.figure(figsize=(3, 3))
plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
plt.title('Page One')
pdf.savefig() # saves the current figure into a pdf page
plt.close()
plt.rc('text', usetex=True)
plt.figure(figsize=(8, 6))
x = np.arange(0, 5, 0.1)
plt.plot(x, np.sin(x), 'b-')
plt.title('Page Two')
pdf.savefig()
plt.close()
plt.rc('text', usetex=False)
fig = plt.figure(figsize=(4, 5))
plt.plot(x, x*x, 'ko')
plt.title('Page Three')
pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig
plt.close()
# We can also set the file's metadata via the PdfPages object:
d = pdf.infodict()
d['Title'] = 'Multipage PDF Example'
d['Author'] = u'Jouni K. Sepp\xe4nen'
d['Subject'] = 'How to create a multipage pdf file and set its metadata'
d['Keywords'] = 'PdfPages multipage keywords author title subject'
d['CreationDate'] = datetime.datetime(2009, 11, 13)
d['ModDate'] = datetime.datetime.today()
Kopiert das nicht nur src.png
Zu out.png
?
– Gerrit
26. Mai 2016 um 11:44 Uhr
Das ist nur ein Beispiel, das zeigt, ob Sie ein Bildobjekt haben (img
), dann können Sie es mit in einer Datei speichern .imsave()
Methode.
– Wunder.Mäuse
26. Mai 2016 um 23:29 Uhr
@wonder.mice würde helfen zu zeigen, wie man ein Bild erstellt, ohne die aktuelle Figur zu verwenden.
– hellseherisch
10. August 2016 um 6:50 Uhr
@wonder.mice Danke für dieses Beispiel, es ist das erste, das mir gezeigt hat, wie man ein Bildobjekt in .png speichert.
– Arthur Dent
24. Mai 2017 um 21:09 Uhr
@scry Sie müssen nicht immer ein Bild erstellen, manchmal probieren Sie Code aus und möchten eine visuelle Ausgabe, in solchen Fällen ist es praktisch.
– Schütze
13. Februar 2019 um 15:08 Uhr
Afroditi
Ich habe folgendes verwendet:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc="upper center", numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
plt.close()
Ich fand es sehr wichtig, plt.show nach dem Speichern der Figur zu verwenden, sonst funktioniert es nicht.Abbildung in PNG exportiert
Viele der Antworten weiter unten auf der Seite erwähnen
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ührung angezeigtplt.show()
– timctran
8. Juni 2017 um 4:09 Uhr
interessante Pseudo-Antwort, die ordentlich über den tatsächlichen Antworten steht – Golf klatschen
– Demis
21. März um 5:25 Uhr