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

6voto

r_e Points 222

En plus des éléments ci-dessus, j'ai ajouté __file__ pour le nom afin que l'image et le fichier Python aient les mêmes noms. J'ai également ajouté quelques arguments pour l'améliorer :

# Saves a PNG file of the current graph to the folder and updates it every time
# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)
plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')
# Hard coded name: './test.png'

6voto

Woodyet Points 31

Juste une note supplémentaire parce que je ne peux pas encore commenter les messages.

Si vous utilisez plt.savefig('myfig') ou quelque chose de ce genre, assurez-vous d'ajouter un élément plt.clf() après l'enregistrement de l'image. En effet, savefig ne ferme pas le graphe et si vous ajoutez des éléments au graphe après sans avoir mis un plt.clf() vous ajouterez à l'intrigue précédente.

Vous ne le remarquerez peut-être pas si vos tracés sont similaires, car le tracé sera superposé au tracé précédent, mais si vous enregistrez vos chiffres en boucle, le tracé deviendra lentement massif et rendra votre script très lent.

4voto

Hamidreza Points 574

Étant donné qu'aujourd'hui (ce n'était pas le cas lorsque cette question a été posée), de nombreuses personnes utilisent Jupyter Notebook comme console python, il existe un moyen extrêmement simple de sauvegarder les tracés en tant que .png il suffit d'appeler le matplotlib 's pylab de Jupyter Notebook, tracer la figure "en ligne" dans les cellules de Jupyter, puis faire glisser cette figure/image dans un répertoire local. N'oubliez pas %matplotlib inline dès la première ligne !

3voto

Comme nous l'avons suggéré précédemment, vous pouvez soit utiliser :

import matplotlib.pyplot as plt
plt.savefig("myfig.png")

Pour enregistrer l'image IPhython que vous affichez. Dans un autre ordre d'idée (sous un angle différent), si vous avez l'occasion de travailler avec open cv, ou si vous avez importé open cv, vous pouvez opter pour :

import cv2

cv2.imwrite("myfig.png",image)

Mais c'est juste au cas où vous auriez besoin de travailler avec Open CV. Sinon, il n'y a pas d'autre solution. plt.savefig() devrait suffire.

3voto

Mark90 Points 35

Je recommande l'utilisation de wrappers pour le rendu ou le contrôle du tracé. des exemples peuvent être mpltex ( https://github.com/liuyxpp/mpltex ) ou prettyplotlib ( https://github.com/olgabot/prettyplotlib ).

import mpltex

@mpltex.acs_decorator
def myplot():
  plt.figure()
  plt.plot(x,y,'b-',lable='xxx')
  plt.tight_layout(pad=0.5)
  plt.savefig('xxxx')  # the figure format was controlled by the decorator, it can be either eps, or pdf or png....
  plt.close()

J'utilise beaucoup ce décorateur pour publier des articles académiques dans diverses revues de l'American Chemical Society, de l'American Physics Society, de l'Opticcal Society American, de l'Elsivier, etc.

L'image suivante en est un exemple ( https://github.com/MarkMa1990/gradientDescent ) : an example of gradient descent

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