Frage Speichern Sie das Diagramm in der Bilddatei, anstatt es mit Matplotlib anzuzeigen


Ich schreibe ein schnell und schmutzig Skript, um Plots im laufenden Betrieb zu generieren. Ich verwende den folgenden Code (von 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 das Plot nicht auf einer GUI anzeigen, sondern das Plot in einer Datei speichern (zB foo.png), so dass es zum Beispiel in Batch-Skripten verwendet werden kann. Wie mache ich das?


734
2018-03-08 17:38


Ursprung


Antworten:


Während die Frage beantwortet wurde, möchte ich einige nützliche Tipps bei der Verwendung hinzufügen Savefig. Das Dateiformat kann durch die Erweiterung angegeben werden:

savefig('foo.png')
savefig('foo.pdf')

Wird eine gerasterte oder vektorisierte Ausgabe geben, beides, was nützlich sein könnte. Außerdem wirst du das finden pylab hinterlässt ein großzügiges, oft unerwünschtes Leerzeichen um das Bild herum. Entferne es mit:

savefig('foo.png', bbox_inches='tight')

897
2018-03-27 13:35



Die Lösung ist:

pylab.savefig('foo.png')

125
2018-03-27 11:36



Wie andere gesagt haben, plt.savefig() oder fig1.savefig() ist in der Tat die Möglichkeit, ein Bild zu speichern.

Allerdings habe ich festgestellt, dass in bestimmten Fällen (z. B. mit Spyder) plt.ion(): interaktiver Modus = Ein) Die Figur wird immer angezeigt. Ich arbeite daran, indem ich das Schließen des Zahlenfensters in meiner riesigen Schleife erzwinge, also habe ich während der Schleife keine Millionen offener Figuren:

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

110
2018-04-28 22:35



Gerade diesen Link in der MatPlotLib-Dokumentation zu diesem Problem gefunden: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

Sie sagen, dass der einfachste Weg, zu verhindern, dass die Figur auftaucht, ein nicht-interaktives Backend (zB. Agg), via ist 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 es immer noch plt.close( fig ), seither haben Sie die Möglichkeit, bestimmte Zahlen auszublenden (während einer Schleife), aber trotzdem Zahlen für die Post-Loop-Datenverarbeitung anzuzeigen. Es ist wahrscheinlich langsamer als die Auswahl eines nicht interaktiven Backends - wäre interessant, wenn jemand das getestet hätte.


58
2018-01-04 00:35



Wenn Sie das Konzept der "aktuellen" Figur nicht mögen, tun Sie:

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)

32
2018-01-30 18:30



Die anderen Antworten sind korrekt. Manchmal finde ich jedoch, dass ich die Figur öffnen möchte Objekt später. Ich möchte zum Beispiel die Etikettengröße ändern, ein Raster hinzufügen oder andere Bearbeitungen vornehmen. In einer perfekten Welt würde ich den Code, der die Handlung erzeugt, einfach wiederholen und die Einstellungen anpassen. Leider ist die Welt nicht perfekt. Daher füge ich zusätzlich zu dem Speichern in PDF oder PNG hinzu:

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

So kann ich später das Figurenobjekt laden und die Einstellungen nach Belieben manipulieren.

Ich schreibe auch den Stack mit dem Quellcode und locals() Wörterbuch für jede Funktion / Methode im Stack, damit ich später genau sagen kann, was die Figur generiert hat.

NB: Seien Sie vorsichtig, da diese Methode manchmal große Dateien erzeugt.


22
2018-05-26 11:48



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()

21
2018-06-30 08:38



Nachdem Sie den plot () und andere Funktionen verwendet haben, um den gewünschten Inhalt zu erstellen, können Sie eine Klausel wie diese verwenden, um zwischen dem Zeichnen auf dem Bildschirm oder der Datei auszuwählen:

import matplotlib.pyplot as plt

fig = plt.figure(figuresize=4, 5)
# use plot(), etc. to create your plot.

# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)  

if save_file:
    plt.savefig(save_file)
    plt.close(fig)
else:
    plt.show()

17
2017-10-11 22:12



Ich habe folgendes benutzt:

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()  
f.close()
plt.close()

Ich fand es sehr wichtig, plt.show nach dem Speichern der Figur zu verwenden, sonst wird es nicht funktionieren.Figur in PNG exportiert


15
2018-04-05 13:34