it-swarm.com.de

Speichern Sie die Zeichnung in einer Bilddatei, anstatt sie mit Matplotlib anzuzeigen

Ich schreibe ein schnelles und schmutziges Skript, um Handlungen im Handumdrehen zu generieren. Ich benutze den folgenden Code (aus 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 ihn in einer Datei (z. B. foo.png) speichern, damit er beispielsweise in Stapelskripten verwendet werden kann. Wie mache ich das?

988

Während die Frage beantwortet wurde, möchte ich einige nützliche Tipps für die Verwendung von matplotlib.pyplot.savefig hinzufügen. Das Dateiformat kann durch die Erweiterung angegeben werden:

from matplotlib import pyplot as plt

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

Gibt eine gerasterte oder vektorisierte Ausgabe aus, die beide nützlich sein könnten. Darüber hinaus werden Sie feststellen, dass pylab ein großzügiges, häufig unerwünschtes Leerzeichen um das Bild herum hinterlässt. Entfernen Sie es mit:

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

Wie andere gesagt haben, ist plt.savefig() oder fig1.savefig() in der Tat der Weg, um ein Bild zu speichern.

Ich habe jedoch festgestellt, dass in bestimmten Fällen (z. B. wenn Spyder plt.ion() hat: interactive mode = On) die Abbildung immer angezeigt wird. Ich arbeite daran, indem ich das Schließen des Figurenfensters in meiner riesigen Schleife erzwinge, sodass ich während der Schleife keine Million offener Figuren habe:

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
169
Demis

Die Lösung ist:

pylab.savefig('foo.png')
155

Wir haben diesen Link in der MatPlotLib-Dokumentation gefunden, der genau dieses Problem behandelt: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

Sie sagen, dass der einfachste Weg, das Auftauchen der Figur zu verhindern, die Verwendung eines nicht interaktiven Backends (zB Agg) über matplotib.use(<backend>) ist, zB:

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 ) zu verwenden, da Sie dann die Möglichkeit haben, bestimmte Zahlen (während einer Schleife) auszublenden, aber weiterhin 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 dies testen würde.

UPDATE: Für Spyder können Sie das Backend normalerweise nicht auf diese Weise einstellen. (Da Spyder Matplotlib normalerweise vorzeitig lädt, können Sie matplotlib.use() nicht verwenden.) .

Verwenden Sie stattdessen plt.switch_backend('Agg') oder deaktivieren Sie " enable support " in den Spyder-Einstellungen und führen Sie den Befehl matplotlib.use('Agg') selbst aus.

Aus diesen beiden Hinweisen: eins , zwei

79
Demis

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)
43
wonder.mice

Die anderen Antworten sind richtig. Manchmal stelle ich jedoch fest, dass ich die Figur Objekt 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 zur Erstellung des Plots 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:

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 ändern.

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

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

26
gerrit

Nachdem Sie mit plot () und anderen Funktionen den gewünschten Inhalt erstellt haben, können Sie mit einer Klausel wie der folgenden zwischen dem Plotten auf dem Bildschirm und dem Ablegen von Dateien wählen:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4, 5))       # size in inches
# 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()
26
Mark P.
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()
24
Victor Juliet

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 funktioniert es nicht. Figur exportiert in png

21
Cristian Muñoz

Sie können entweder:

plt.show(hold=False)
plt.savefig('name.pdf')

und denken Sie daran, das Speichern zu beenden, bevor Sie den GUI-Plot schließen. Auf diese Weise können Sie das Bild vorher sehen.

Alternativ können Sie es sich mit plt.show() ansehen. Schließen Sie dann die GUI und führen Sie das Skript erneut aus. Ersetzen Sie diesmal plt.show() durch plt.savefig().

Alternativ können Sie verwenden

fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')
12
Nutcracker

Die Lösung :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')

Wenn Sie das Bild anzeigen und speichern möchten, verwenden Sie:

%matplotlib inline

nach import matplotlib

11
Durgesh satam

Wenn Sie wie ich Spyder IDE verwenden, müssen Sie den interaktiven Modus deaktivieren mit:

plt.ioff()

(Dieser Befehl wird beim wissenschaftlichen Start automatisch gestartet.)

Wenn Sie es wieder aktivieren möchten, verwenden Sie:

plt.ion()

11
Covich

Laut Frage Matplotlib (Pyplot) savefig gibt leeres Bild aus .

Eine Sache sollte beachtet werden: Wenn Sie plt.show verwenden und dies nach plt.savefig tun, erhalten Sie ein leeres Bild.

Ein detailliertes Beispiel:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __== '__main__':
    test_draw()

enter image description here

6
Jayhello
#write the code for the plot     
plt.savefig("filename.png")

Die Datei wird im selben Verzeichnis wie die ausgeführte Python/Jupyter-Datei gespeichert

5
Swaraj Kumar
import matplotlib.pyplot as plt
plt.savefig("image.png")

In Jupyter Notebook müssen Sie plt.show() entfernen und plt.savefig() zusammen mit dem Rest des PLT-Codes in einer Zelle hinzufügen. Das Bild wird weiterhin in Ihrem Notizbuch angezeigt.

4
Punnerud

Angesichts der Tatsache, dass heute (als diese Frage nicht gestellt wurde) viele Leute Jupyter Notebook als python Konsole verwenden, gibt es eine äußerst einfache Möglichkeit, die Diagramme als .png zu speichern. Rufen Sie einfach die matplotlib auf pylab class aus Jupyter Notebook, zeichne die 'Inline'-Jupyterzellen der Figur und ziehe diese Figur/das Bild in ein lokales Verzeichnis. Vergiss nicht %matplotlib inline in der ersten Zeile!

3
Hamidreza

Zusätzlich zu den obigen habe ich __file__ für den Namen hinzugefügt, damit das Bild und die Python -Datei den gleichen Namen erhalten. Ich habe auch ein paar Argumente hinzugefügt, damit es besser aussieht:

# Saves a PNG file of the current graph to the folder and updates it every time
# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)
plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')
# Hard coded name: './test.png'

Letzter Tipp gefunden HIER .

1
r_e

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.

import os

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
    path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format=fig_extension, dpi=resolution)

'fig_id' ist der Name, unter dem Sie Ihre Figur speichern möchten. Ich hoffe es hilft:)

0
Rudresh Dixit