1411 votes

Enregistrer le tracé dans un fichier image au lieu de l'afficher

Cela permet d'afficher la figure dans une interface graphique :

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()

Mais comment puis-je enregistrer la figure dans un fichier (par exemple foo.png) ?

91 votes

Il semble que j'ai trouvé la réponse : its pylab.savefig('foo.png')

2 votes

Le lien devrait peut-être renvoyer vers quelque part dans matplotlib.org ?

45 votes

De plus, si l'on n'utilise pas pylab, l'objet figure a une fonction savefig également. Vous pouvez donc appeler fig = plt.figure() puis fig.savefig(...) .

1751voto

Hooked Points 16345

Lors de l'utilisation de matplotlib.pyplot.savefig Le format du fichier peut être spécifié par l'extension :

from matplotlib import pyplot as plt

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

Cela donne une sortie tramée ou vectorisée respectivement. En outre, il y a parfois des espaces blancs indésirables autour de l'image, qui peuvent être supprimés avec :

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

Notez que si l'on affiche le tracé, plt.show() devrait suivre plt.savefig() ; sinon, l'image du fichier sera vide.

12 votes

Est-il possible de modifier les dimensions de l'image obtenue ?

44 votes

@Asmageddon In plt.savefig Vous pouvez modifier la résolution (dpi), voir le lien dans la réponse. Les dimensions peuvent être contrôlées lors de la création de la figure, voir figsize en matplotlib.org/api/figure_api.html#matplotlib.figure.Figure

0 votes

@Hooked plt.savefig sauvegarde la figure mais n'empêche pas de l'afficher. Même lorsque je laisse de côté plt.show(), la figure est affichée. Comment puis-je empêcher cela ?

290voto

Demis Points 2423

Comme d'autres l'ont dit, plt.savefig() o fig1.savefig() est en effet le moyen d'enregistrer une image.

Cependant, j'ai constaté que dans certains cas le chiffre est toujours affiché . (par exemple, avec Spyder ayant plt.ion() : mode interactif = Activé). Je contourne ce problème en utilisant en forçant la fenêtre de la figure à se fermer avec :

plt.close(figure_object)

(voir la documentation ). De cette façon, je n'ai pas un million de chiffres ouverts pendant une grande boucle. Exemple d'utilisation :

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 window

Vous devriez être en mesure de rouvrir le chiffre plus tard si nécessaire avec fig.show() (je ne l'ai pas testé moi-même).

171voto

Lukasz Czerwinski Points 1098

La solution est la suivante :

pylab.savefig('foo.png')

4 votes

Pylab n'est pas défini

119voto

Demis Points 2423

Je viens de trouver ce lien sur la documentation de MatPlotLib qui traite exactement de ce problème : http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

Selon eux, le moyen le plus simple d'empêcher l'apparition de la figure est d'utiliser un backend non interactif (par exemple Agg), par le biais de matplotib.use(<backend>) , par exemple :

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

Personnellement, je préfère encore utiliser plt.close( fig ) Depuis lors, vous avez la possibilité de masquer certains chiffres (pendant une boucle), mais de continuer à afficher les chiffres pour le traitement des données après la boucle. Cette solution est probablement plus lente que le choix d'un backend non interactif - il serait intéressant que quelqu'un la teste.

MISE À JOUR pour Spyder, vous ne pouvez généralement pas définir le backend de cette manière (parce que Spyder charge généralement matplotlib au début, ce qui vous empêche d'utiliser matplotlib.use() ).

Au lieu de cela, utilisez plt.switch_backend('Agg') ou Éteindre " permettre le soutien "dans les préférences de Spyder et lancez le programme matplotlib.use('Agg') commandez vous-même.

A partir de ces deux indices : un , deux

56voto

wonder.mice Points 1333

Si vous n'aimez pas le concept du chiffre "actuel", faites-le :

import matplotlib.image as mpimg

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

2 votes

Ne s'agit-il pas d'une simple copie src.png a out.png ?

1 votes

Ce n'est qu'un exemple, qui montre que si vous avez un objet image ( img ), puis vous pouvez l'enregistrer dans un fichier avec .imsave() méthode.

6 votes

@wonder.mice permettrait de montrer comment créer une image sans utiliser la figure actuelle.

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