Plot in Bilddatei speichern, anstatt ihn anzuzeigen

Lesezeit: 6 Minuten

Benutzeravatar von Homunculus Reticulli
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)?

  • 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 angezeigt plt.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

Hookeds Benutzeravatar
Süchtig

Beim Benutzen matplotlib.pyplot.savefigdas 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

Benutzeravatar von Demis
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).

Benutzeravatar von Lukasz Czerwinski
Lukasz Czerwinski

Die Lösung ist:

pylab.savefig('foo.png')

  • pylab ist nicht definiert

    Benutzer14349917

    6. Januar 2021 um 3:42 Uhr

Benutzeravatar von Demis
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

Benutzeravatar von wonder.mice
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


Benutzeravatar von Victor Juliet
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


Benutzeravatar von afroditi
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

1449240cookie-checkPlot in Bilddatei speichern, anstatt ihn anzuzeigen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy