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

39voto

Victor Juliet Points 842
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
    plt.figure(figsize=(3, 3))
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
    plt.title('Page One')
    pdf.savefig()  # saves the current figure into a pdf page
    plt.close()

    plt.rc('text', usetex=True)
    plt.figure(figsize=(8, 6))
    x = np.arange(0, 5, 0.1)
    plt.plot(x, np.sin(x), 'b-')
    plt.title('Page Two')
    pdf.savefig()
    plt.close()

    plt.rc('text', usetex=False)
    fig = plt.figure(figsize=(4, 5))
    plt.plot(x, x*x, 'ko')
    plt.title('Page Three')
    pdf.savefig(fig)  # or you can pass a Figure object to pdf.savefig
    plt.close()

    # We can also set the file's metadata via the PdfPages object:
    d = pdf.infodict()
    d['Title'] = 'Multipage PDF Example'
    d['Author'] = u'Jouni K. Sepp\xe4nen'
    d['Subject'] = 'How to create a multipage pdf file and set its metadata'
    d['Keywords'] = 'PdfPages multipage keywords author title subject'
    d['CreationDate'] = datetime.datetime(2009, 11, 13)
    d['ModDate'] = datetime.datetime.today()

38voto

Cristian Muñoz Points 225

J'ai utilisé les éléments suivants :

import matplotlib.pyplot as plt

p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")  
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")  
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05),        ncol=2, fancybox=True, shadow=True)

plt.savefig('data.png')  
plt.show() 
plt.close()

J'ai trouvé très important d'utiliser plt.show après avoir sauvegardé la figure, sinon cela ne fonctionnera pas. figure exportée en png

34voto

gerrit Points 1588

Les autres réponses sont correctes. Cependant, il m'arrive parfois de vouloir ouvrir la figure objet plus tard. Par exemple, je pourrais vouloir modifier la taille des étiquettes, ajouter une grille ou effectuer d'autres traitements. Dans un monde parfait, il me suffirait de réexécuter le code générant le tracé et d'adapter les paramètres. Hélas, le monde n'est pas parfait. C'est pourquoi, en plus de l'enregistrement au format PDF ou PNG, j'ajoute :

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

Ainsi, je peux charger ultérieurement l'objet figure et manipuler les paramètres à ma guise.

J'écris également la pile avec le code source et les locals() pour chaque fonction/méthode de la pile, de sorte que je puisse ultérieurement savoir exactement ce qui a généré la figure.

NB : Soyez prudent, car cette méthode génère parfois des fichiers volumineux.

31voto

Mark P. Points 291

Après avoir utilisé la fonction plot() et d'autres fonctions pour créer le contenu souhaité, vous pouvez utiliser une clause comme celle-ci pour choisir entre le traçage à l'écran ou dans un fichier :

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4, 5))       # size in inches
# use plot(), etc. to create your plot.

# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)  

if save_file:
    plt.savefig(save_file)
    plt.close(fig)
else:
    plt.show()

16voto

Covich Points 47

Si, comme moi, vous utilisez l'IDE Spyder, vous devez désactiver le mode interactif avec :

plt.ioff()

(cette commande est automatiquement lancée lors du démarrage scientifique)

Si vous souhaitez l'activer à nouveau, utilisez :

plt.ion()

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