174 votes

Appel de pylab.savefig sans affichage en ipython

J'ai besoin de créer une figure dans un fichier sans l'afficher dans le notebook IPython. Je ne comprends pas bien l'interaction entre IPython y matplotlib.pylab à cet égard. Mais, quand j'appelle pylab.savefig("test.png") la figure actuelle est affichée en plus d'être sauvegardée dans la base de données. test.png . Lors de l'automatisation de la création d'un grand nombre de fichiers de tracés, cela est souvent indésirable. Ou dans la situation où un fichier intermédiaire pour un traitement externe par une autre application est souhaité.

Je ne sais pas si c'est un matplotlib o IPython question du carnet de notes.

244voto

staticfloat Points 1285

Il s'agit d'une question relative à matplotlib, et vous pouvez contourner ce problème en utilisant un backend qui ne s'affiche pas pour l'utilisateur, par exemple 'Agg' :

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

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

EDITAR: Si vous ne voulez pas perdre la possibilité d'afficher les graphiques, désactivez la fonction Mode interactif et n'appelle que plt.show() lorsque vous êtes prêt à afficher les graphiques :

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

105voto

Mojtaba Khodadadi Points 964

Nous n'avons pas besoin de plt.ioff() o plt.show() (si nous utilisons %matplotlib inline ). Vous pouvez tester le code ci-dessus sans plt.ioff() . plt.close() a le rôle essentiel. Essayez celui-là :

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

Si vous exécutez ce code dans iPython, il affichera un deuxième tracé, et si vous ajoutez plt.close(fig2) jusqu'à la fin, vous ne verrez rien.

En conclusion, si vous fermez la figure par plt.close(fig) il ne sera pas affiché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X