savefig - save plot python




Salva il grafico sul file immagine invece di visualizzarlo usando Matplotlib (10)

Come altri hanno già detto, plt.savefig() o fig1.savefig() è davvero il modo per salvare un'immagine.

Tuttavia ho trovato che in alcuni casi (ad esempio con Spyder che ha plt.ion() : modalità interattiva = On) la figura viene sempre mostrata. Lavoro attorno a questo forzando la chiusura della finestra delle figure nel mio loop gigante, quindi non ho un milione di figure aperte durante il ciclo:

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

Sto scrivendo uno script veloce e sporco per generare trame al volo. Sto usando il codice qui sotto (dalla documentazione di Matplotlib ) come punto di partenza:

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

Non voglio visualizzare la trama su una GUI, invece, voglio salvare la trama in un file (ad esempio foo.png), in modo che, ad esempio, possa essere utilizzata negli script batch. Come lo faccio?


Dopo aver usato la trama () e altre funzioni per creare il contenuto che desideri, puoi usare una clausola come questa per selezionare tra il plottaggio sullo schermo o il file:

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

Ho usato il seguente:

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

Ho trovato molto importante usare plt.show dopo aver salvato la figura, altrimenti non funzionerà. figura esportata in png


La soluzione è:

pylab.savefig('foo.png')

Le altre risposte sono corrette. Tuttavia, a volte trovo che voglio aprire l' oggetto figure in seguito. Ad esempio, potrei voler modificare le dimensioni dell'etichetta, aggiungere una griglia o eseguire altre elaborazioni. In un mondo perfetto, vorrei semplicemente rieseguire il codice generando la trama e adattare le impostazioni. Ahimè, il mondo non è perfetto. Pertanto, oltre al salvataggio in PDF o PNG, aggiungo:

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

In questo modo, posso caricare in seguito l'oggetto figure e modificare le impostazioni come preferisco.

Scrivo anche la pila con il dizionario del codice sorgente e dei locals() per ogni funzione / metodo nello stack, in modo che possa successivamente dire esattamente cosa ha generato la figura.

NB: fai attenzione, poiché a volte questo metodo genera file enormi.


Mentre la domanda è stata risposta, vorrei aggiungere alcuni suggerimenti utili quando si utilizza savefig . Il formato del file può essere specificato dall'estensione:

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

Fornirà rispettivamente una uscita rasterizzata o vettorizzata, entrambi che potrebbero essere utili. Inoltre, scoprirete che pylab lascia uno spazio bianco generoso, spesso indesiderato attorno all'immagine. Rimuovilo con:

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

Se non ti piace il concetto della figura "attuale", fai:

import matplotlib.image as mpimg

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

Se, come me, usi Spyder IDE, devi disabilitare la modalità interattiva con:

plt.ioff()

(questo comando viene avviato automaticamente con l'avvio scientifico)

Se si desidera abilitarlo nuovamente, utilizzare:

plt.ion()


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

Il file verrà salvato nella stessa directory in cui è in esecuzione il file python / Jupyter


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




plot