2013-03-30 8 views
50

Ich muss eine Figur in einer Datei erstellen, ohne sie in IPython-Notizbuch anzuzeigen. Ich bin nicht klar auf die Interaktion zwischen IPython und matplotlib.pylab in dieser Hinsicht. Aber, wenn ich pylab.savefig("test.png") rufe, wird die aktuelle Zahl zusätzlich angezeigt, um in test.png gespeichert zu werden. Bei der Automatisierung der Erstellung einer großen Menge von Plot-Dateien ist dies oft unerwünscht. Oder in der Situation, dass eine Zwischendatei für die externe Verarbeitung durch eine andere App gewünscht wird.Aufruf von pylab.savegig ohne Anzeige in ipython

Nicht sicher, ob dies eine matplotlib oder IPython Notebook-Frage ist.

Antwort

79

Dies ist eine Matplotlib-Frage, die Sie umgehen können, indem Sie ein Backend verwenden, das dem Benutzer nicht angezeigt wird, z. 'Agg':

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

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

EDIT: Wenn Sie die Möglichkeit Plots nicht verlieren wollen angezeigt werden, schalten Sie Interactive Mode, und nur plt.show() anrufen, wenn Sie bereit sind, die Plots anzuzeigen:

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 - aber ich möchte generell die Inline-Plotten in iPython beibehalten. Was Sie vorschlagen, funktioniert gut, wenn Sie das Backend komplett umstellen. Die Frage ist, wie Sie die generelle Situation des Inline-Plottings mit dem Ausnahmefall des Speicherns von Zahlen berücksichtigen (ohne inline darzustellen). Mit Ihrem Vorschlag habe ich versucht, die Module neu zu laden und das Backend vorübergehend zu ändern, aber ohne Erfolg. Irgendwelche Ideen, wie Sie das Backend innerhalb einer iPython-Notebook-Sitzung vorübergehend wechseln können? – tnt

+1

Ich habe die Frage aktualisiert, um über das interaktive Plotten und die Befehle 'close()' und 'show()' zu sprechen, die Ihr Problem lösen sollten. Das Ändern von Back-Ends im laufenden Betrieb wird nicht unterstützt, wie Sie festgestellt haben. – staticfloat

+3

Vielen Dank für das ausgezeichnete Feedback. Es scheint, dass der plt.close (fig) der Schlüsselbefehl für meine Bedürfnisse ist. Ich bin mir immer noch nicht sicher, ob es sich auf die Operation auswirkt. aber ich vermisse wahrscheinlich etwas. Danke noch einmal. – tnt

25

Wir brauchen nicht plt.ioff() oder plt.show() (wenn wir %matplotlib inline verwenden). Sie können obigen Code ohne plt.ioff() testen. plt.close() hat die wesentliche Rolle. Versuchen Sie dieses:

%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') 

Wenn Sie diesen Code in ipython ausführen, wird es ein zweites Grundstück anzuzeigen, und wenn Sie plt.close(fig2) bis Ende es hinzuzufügen, werden Sie nichts sehen.

Abschließend, Wenn Sie Abbildung durch plt.close(fig) schließen, wird es nicht angezeigt.

+0

bessere Lösung! – PlagTag

+0

Bessere Lösung in der Tat! Ich erstelle und speichere viele Plots in einer Schleife. Mit 'plt.ioff' bekomme ich' RuntimeWarning: Mehr als 20 Figuren wurden geöffnet ... '. 'plt.close' löste es. – Nagasaki45

Verwandte Themen