python pyplot Enregistrer le graphique dans le fichier image au lieu de l'afficher à l'aide de Matplotlib




matplotlib title position (11)

J'écris un script rapide et sale pour générer des complots à la volée. J'utilise le code ci-dessous (à partir de la documentation de Matplotlib ) comme point de départ:

from pylab import figure, axes, pie, title, show

# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]

explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})

show()  # Actually, don't show, just save to foo.png

Je ne veux pas afficher le tracé sur une interface graphique, mais je veux enregistrer le tracé dans un fichier (disons foo.png), de sorte que, par exemple, il puisse être utilisé dans des scripts batch. Comment je fais ça?


Après avoir utilisé le plot () et d'autres fonctions pour créer le contenu que vous voulez, vous pouvez utiliser une clause comme celle-ci pour choisir entre le tracé à l'écran ou le fichier:

import matplotlib.pyplot as plt

fig = plt.figure(figuresize=4, 5)
# 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()

Les autres réponses sont correctes. Cependant, je trouve parfois que je veux ouvrir l' objet figure plus tard. Par exemple, je pourrais vouloir changer la taille des étiquettes, ajouter une grille, ou faire un autre traitement. Dans un monde parfait, je voudrais simplement réexécuter le code générant l'intrigue, et adapter les paramètres. Hélas, le monde n'est pas parfait. Par conséquent, en plus d'enregistrer au format PDF ou PNG, j'ajoute:

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

Comme ça, je peux plus tard charger l'objet figure et manipuler les paramètres à ma guise.

J'écris aussi la pile avec le dictionnaire source-code et locals() pour chaque fonction / méthode dans la pile, de sorte que je puisse dire plus tard exactement ce qui a généré la figure.

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


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

plt.ioff()

(cette commande est automatiquement lancée avec le démarrage scientifique)

Si vous souhaitez l'activer à nouveau, utilisez:

plt.ion()


J'ai utilisé ce qui suit:

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()  
f.close()
plt.close()

J'ai trouvé très important d'utiliser plt.show après avoir enregistré la figure, sinon ça ne marchera pas. figure exportée en png


Alors que la question a été répondue, je voudrais ajouter quelques conseils utiles lors de l'utilisation de savefig . Le format de fichier peut être spécifié par l'extension:

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

Donnera une sortie pixellisée ou vectorisée respectivement, les deux qui pourraient être utiles. De plus, vous constaterez que le pylab laisse un pylab généreux, souvent indésirable, autour de l'image. Retirez-le avec:

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

#write the code for the plot     
plt.savefig("filename.png")

Le fichier sera sauvegardé dans le même répertoire que le fichier python / Jupyter


Si vous n'aimez pas le concept de la figure "actuelle", faites:

import matplotlib.image as mpimg

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

La solution est:

pylab.savefig('foo.png')

La solution :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')

Si vous voulez afficher l'image ainsi que l'enregistrement de l'image, utilisez:

%matplotlib inline

après l' import matplotlib


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

Cependant, j'ai trouvé que dans certains cas (par exemple avec Spyder ayant plt.ion() : mode interactif = On) la figure est toujours affichée. Je contourne cela en forçant la fermeture de la fenêtre de chiffres dans ma boucle géante, donc je n'ai pas un million de chiffres ouverts pendant la boucle:

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

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




matplotlib