J'écris un script rapide et sale pour générer des tracés à la volée. J'utilise le code ci-dessous (de la documentation 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, au lieu de cela, je veux enregistrer le tracé dans un fichier (disons foo.png), afin que, par exemple, il puisse être utilisé dans des scripts de traitement par lots. Comment je fais ça?
python
matplotlib
plot
Homunculus Reticulli
la source
la source
savefig
méthode. Vous pouvez donc appelerfig = plt.figure()
alorsfig.savefig(...)
.plt.close(fig)
ce qui est particulièrement important dans les grandes boucles. Sinon, les chiffres restent ouverts et attendent en mémoire et tous les chiffres ouverts seront affichés lors de l'exécutionplt.show()
Réponses:
Bien que la question ait été répondue, je voudrais ajouter quelques conseils utiles lors de l'utilisation de matplotlib.pyplot.savefig . Le format de fichier peut être spécifié par l'extension:
Donnera respectivement une sortie tramée ou vectorisée, les deux pouvant être utiles. De plus, vous constaterez que cela
pylab
laisse un espace généreux, souvent indésirable, autour de l'image. Retirez-le avec:la source
plt.savefig
vous pouvez changer le dpi, voir le lien dans la réponse. Les dimensions peuvent être contrôlées lors de la création de la figure, voirfigsize
dans matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
ce qui devrait désactiver l'interactivité dans lesmatplotlib.pyplot
commandes.foo.png
est le chemin. Vous pouvez, par exemple, le mettre dans un répertoire comme celui-cisavefig("mydir/foo.png")
.Comme d'autres l'ont dit,
plt.savefig()
oufig1.savefig()
est en effet le moyen de sauvegarder une image.Cependant, j'ai trouvé que dans certains cas, le chiffre est toujours affiché . (par exemple avec Spyder ayant
plt.ion()
: mode interactif = On.) Je contourne cela en forçant la fermeture de la fenêtre de figure dans ma boucle géante avecplt.close(figure_object)
(voir la documentation ), donc je n'ai pas un million de chiffres ouverts pendant la boucle:Vous devriez pouvoir rouvrir la figure plus tard si nécessaire avec
fig.show()
(je ne me suis pas testé).la source
plt.ioff() # turn of interactive plotting mode
, mais cela peut désactiver le comportement que vous souhaitez utiliser si votre code se termine avec une erreur.plt.close(fig)
résoluLa solution est:
la source
Je viens de trouver ce lien sur la documentation MatPlotLib traitant exactement ce problème: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Ils disent que le moyen le plus simple d'empêcher la figure d'apparaître est d'utiliser un backend non interactif (par exemple Agg), via
matplotib.use(<backend>)
, par exemple:Personnellement, je préfère toujours utiliser
plt.close( fig )
, car vous avez la possibilité de masquer certains chiffres (pendant une boucle), mais d'afficher toujours des chiffres pour le traitement des données après la boucle. Il est probablement plus lent que de choisir un backend non interactif - serait intéressant si quelqu'un le testait.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 tôt, vous empêchant d'utiliser
matplotlib.use()
).À la place, utilisez
plt.switch_backend('Agg')
ou désactivez « activer le support » dans les préférences de Spyder et exécutez lamatplotlib.use('Agg')
commande vous-même.De ces deux indices: un , deux
la source
.plot()
générera une erreur s'ilos.environ['DISPLAY']
n'est pas défini correctement.Si vous n'aimez pas le concept de la figure "actuelle", faites:
la source
src.png
àout.png
?img
), vous pouvez l'enregistrer dans un fichier avec la.imsave()
méthode.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 effectuer un autre traitement. Dans un monde parfait, je relancerais simplement le code générant l'intrigue et j'adapterais 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:
Comme ça, je peux plus tard charger l'objet figure et manipuler les paramètres à ma guise.
J'écris également la pile avec le code source et le
locals()
dictionnaire pour chaque fonction / méthode de la pile, afin de pouvoir dire plus tard exactement ce qui a généré la figure.NB: Attention, cette méthode génère parfois des fichiers volumineux.
la source
la source
Après avoir utilisé plot () et d'autres fonctions pour créer le contenu que vous souhaitez, vous pouvez utiliser une clause comme celle-ci pour choisir entre le traçage à l'écran ou le fichier:
la source
fig = plt.figure(figuresize=4, 5)
pourrait êtrefig = plt.figure(figsize=(4, 5)) #figure sizes in inches
J'ai utilisé ce qui suit:
J'ai trouvé très important d'utiliser plt.show après avoir enregistré la figure, sinon cela ne fonctionnera pas. figure exportée en png
la source
f= plt.savefig('data.png')
Vous pouvez soit faire:
et n'oubliez pas de laisser savefig se terminer avant de fermer le tracé de l'interface graphique. De cette façon, vous pouvez voir l'image à l'avance.
Alternativement, vous pouvez le regarder avec
plt.show()
Puis fermez l'interface graphique et réexécutez le script, mais cette fois remplacezplt.show()
parplt.savefig()
.Vous pouvez également utiliser
la source
Si, comme moi, vous utilisez Spyder IDE, vous devez désactiver le mode interactif avec:
plt.ioff()
(cette commande est lancée automatiquement avec le démarrage scientifique)
Si vous souhaitez le réactiver, utilisez:
plt.ion()
la source
La solution :
Si vous souhaitez afficher l'image ainsi que sauvegarder l'image, utilisez:
après
import matplotlib
la source
Selon la question Matplotlib (pyplot) savefig affiche une image vierge .
Une chose doit noter: si vous utilisez
plt.show
et que cela devrait aprèsplt.savefig
, ou vous donnerez une image vierge.Un exemple détaillé:
la source
Dans Jupyter Notebook, vous devez supprimer
plt.show()
et ajouterplt.savefig()
, avec le reste du code plt dans une cellule. L'image apparaîtra toujours dans votre carnet.la source
Étant donné qu'aujourd'hui (n'était pas disponible lorsque cette question a été posée), de nombreuses personnes utilisent Jupyter Notebook comme console python, il existe un moyen extrêmement simple d'enregistrer les tracés car
.png
, il suffit d'appeler la classematplotlib
's àpylab
partir de Jupyter Notebook, de tracer la figure' en ligne 'jupyter cells, puis faites glisser cette figure / image vers un répertoire local. N'oubliez pas%matplotlib inline
en première ligne!la source
En plus de ceux ci-dessus, j'ai ajouté
__file__
pour le nom afin que l'image et le fichier Python obtiennent les mêmes noms. J'ai également ajouté quelques arguments pour le rendre plus beau:la source
Lors de l'utilisation
matplotlib.pyplot
, vous devez d'abord enregistrer votre tracé puis le fermer en utilisant ces 2 lignes:la source
Comme suggéré précédemment, vous pouvez utiliser:
Pour enregistrer l'image IPhython que vous affichez. Ou sur une note différente (en regardant sous un angle différent), si jamais vous travaillez avec un cv ouvert, ou si vous avez importé un cv ouvert, vous pouvez opter pour:
importer cv2
cv2.imwrite ("myfig.png", image)
Mais c'est juste au cas où vous auriez besoin de travailler avec Open CV. Sinon, plt.savefig () devrait être suffisant.
la source
Vous pouvez enregistrer votre image avec n'importe quelle extension (png, jpg, etc.) et avec la résolution que vous souhaitez. Voici une fonction pour enregistrer votre silhouette.
'fig_id' est le nom sous lequel vous souhaitez enregistrer votre figure. J'espère que cela aide:)
la source
Vous pouvez le faire comme ceci:
la source