web-dev-qa-db-fra.com

Obtenez la liste des figures dans matplotlib

J'aimerais:

pylab.figure()
pylab.plot(x)
pylab.figure()
pylab.plot(y)
# ...
for i, figure in enumerate(pylab.MagicFunctionReturnsListOfAllFigures()):
  figure.savefig('figure%d.png' % i)

Quelle est la fonction magique qui renvoie une liste des figures actuelles dans pylab?

Websearch n'a pas aidé ...

45
Evgeny

Edit: Comme la solution de Matti Pastell le montre , il y a une bien meilleure façon: utilisez plt.get_fignums().


import numpy as np
import pylab
import matplotlib._pylab_helpers

x=np.random.random((10,10))
y=np.random.random((10,10))
pylab.figure()
pylab.plot(x)
pylab.figure()
pylab.plot(y)

figures=[manager.canvas.figure
         for manager in matplotlib._pylab_helpers.Gcf.get_all_fig_managers()]
print(figures)

# [<matplotlib.figure.Figure object at 0xb788ac6c>, <matplotlib.figure.Figure object at 0xa143d0c>]

for i, figure in enumerate(figures):
    figure.savefig('figure%d.png' % i)
15
unutbu

Pyplot a get_fignums méthode qui retourne une liste de chiffres. Cela devrait faire ce que vous voulez:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)
y = -x

plt.figure()
plt.plot(x)
plt.figure()
plt.plot(y)

for i in plt.get_fignums():
    plt.figure(i)
    plt.savefig('figure%d.png' % i)
89
Matti Pastell

Le one-liner suivant récupère la liste des figures existantes:

import matplotlib.pyplot as plt
figs = list(map(plt.figure, plt.get_fignums()))
18
krollspell

Cela devrait vous aider (à partir du doc ​​pylab.figure):

signature d'appel ::

figure (num = None, figsize = (8, 6), dpi = 80, facecolor = 'w', edgecolor = 'k')

Créez une nouvelle figure et retournez a: class: matplotlib.figure.Figure instance. Si num = Aucun , le chiffre nombre sera incrémenté et une nouvelle figure sera créée. ** Les objets de figure retournés ont un attribut nombre contenant ce nombre.

Si vous souhaitez rappeler vos figures dans une boucle, alors une bonne approche serait de stocker vos instances de figures dans une liste et de les appeler dans la boucle.

>> f = pylab.figure()
>> mylist.append(f)
etc...
>> for fig in mylist:
>>     fig.savefig()
3
joaquin

En supposant que vous n'avez pas spécifié manuellement num dans aucun de vos constructeurs de figures (donc tous vos numéros de figures sont consécutifs) et toutes les figures que vous souhaitez enregistrer ont en fait des tracés sur eux ...

import matplotlib.pyplot as plt
plot_some_stuff()
# find all figures
figures = []
for i in range(maximum_number_of_possible_figures):
    fig = plt.figure(i)
    if fig.axes:
        figures.append(fig)
    else:
        break

A l'effet secondaire de créer une nouvelle figure vierge, mais mieux si vous ne voulez pas compter sur une interface non prise en charge

2
mcstrother

J'ai tendance à nommer mes chiffres en utilisant des chaînes plutôt qu'en utilisant l'entier par défaut (et non descriptif). Voici un moyen de récupérer ce nom et d'enregistrer vos chiffres avec un nom de fichier descriptif:

import matplotlib.pyplot as plt
figures = []
figures.append(plt.figure(num='map'))
# Make a bunch of figures ...
assert figures[0].get_label() == 'map'

for figure in figures:
    figure.savefig('{0}.png'.format(figure.get_label()))
1
Wesley Baugh