Chiamare pylab.savefig senza visualizzazione in ipython


111

Devo creare una figura in un file senza visualizzarla nel notebook IPython. Non sono chiaro sull'interazione tra IPythone matplotlib.pylabal riguardo. Ma quando chiamo pylab.savefig("test.png")la cifra corrente viene visualizzata oltre a essere salvata in test.png. Quando si automatizza la creazione di un ampio set di file di stampa, ciò è spesso indesiderabile. O nella situazione in cui si desidera un file intermedio per l'elaborazione esterna da un'altra app.

Non sono sicuro che questa sia una domanda matplotlibo un IPythontaccuino.


La risposta di @staticfloat ha funzionato per me anche quando non è all'interno di un notebook e quando si utilizza matplotlib tramite JuliaLang; usingioff
Vass

Risposte:


173

Questa è una domanda matplotlib e puoi aggirare il problema usando un backend che non viene mostrato all'utente, ad esempio 'Agg':

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

MODIFICA: se non vuoi perdere la possibilità di visualizzare i grafici, disattiva la modalità interattiva e chiama solo plt.show()quando sei pronto per visualizzare i grafici:

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
Ok, ma in generale voglio mantenere la stampa in linea all'interno di iPython. Quello che suggerisci funziona bene se fai un passaggio completo sul backend. La domanda è come si tiene conto della situazione generale della stampa in linea con il caso eccezionale del salvataggio di cifre (senza mostrare in linea). Con il tuo suggerimento, ho tentato di ricaricare i moduli e cambiare il backend temporaneamente ma senza successo. Qualche idea su come cambiare temporaneamente il backend all'interno di una sessione di notebook iPython?
tnt

1
Ho aggiornato la domanda per parlare della stampa interattiva e dei comandi close()e show(), che dovrebbero risolvere il tuo problema. la modifica dei backend al volo non è supportata, come hai scoperto.
staticfloat

3
Grazie per l'ottimo feedback. Sembra che il plt.close (fig) sia il comando chiave per le mie necessità. Non sono ancora chiaro sull'ioff in quanto non sembra influire sull'operazione; ma probabilmente mi sto perdendo qualcosa. Grazie ancora.
tnt

1
La ricetta che ho dato è generale; se non stai lavorando nel notebook ipython, plt.ioff () è importante per impedire alle figure di sfarfallare dentro e fuori dallo schermo, poiché nella riga di comando le figure di ipython vengono tracciate non appena chiami plt.plot()se la modalità interattiva è attiva. La disattivazione della modalità interattiva ritarda la visualizzazione di eventuali grafici fino a plt.show(). Poiché stai utilizzando ipython notebook, la modalità interattiva viene trattata in modo diverso.
staticfloat

Per me, matplotlib.use('Agg')da solo ha fatto il trucco. Non avevo bisogno di nessuno plt.show()o plt.ioff()nel mio codice.
Zhanwen Chen

67

Non abbiamo bisogno di plt.ioff()o plt.show()(se usiamo %matplotlib inline). Puoi testare il codice sopra senza plt.ioff(). plt.close()ha il ruolo essenziale. Prova questo:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

Se esegui questo codice in iPython, verrà visualizzato un secondo grafico e se lo aggiungi plt.close(fig2)alla fine, non vedrai nulla.

In conclusione, se chiudi la cifra per plt.close(fig), non verrà visualizzata.


5
Soluzione davvero migliore! Genero e salvo molti grafici in un ciclo. Con plt.ioffottengo RuntimeWarning: More than 20 figures have been opened.... plt.closerisolto.
Nagasaki45
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.