2 votes

Comment itérer un dictionnaire de références à des figures de matplotlib

J'ai un certain nombre de fonctions qui créent chacune un ou plusieurs chiffres. Au fur et à mesure que les figures sont créées, une référence est ajoutée à un dictionnaire, comme suit :

self.figures['figureKey'] = figure()

Dans une autre fonction, j'aimerais itérer ce dictionnaire et enregistrer chacun des chiffres ; il serait intéressant d'utiliser la clé du dictionnaire comme une partie ou la totalité du nom du fichier. J'ai réussi à itérer le dictionnaire, mais la fonction figure() semble exiger un nombre entier correspondant au numéro de figure, rejetant la référence donnée par la clé.

    for fig in self.figures:
        figure(self.figures[fig])  #does not work
        figure(fig)                #also does not work
        savefig(fig)               #seems to let me use the key as a filename--nice

J'ai également essayé d'utiliser `get_fignums()' et d'itérer le tableau retourné, mais cela fait perdre l'association avec les noms des clés. Peut-être est-il possible de déréférencer le numéro du chiffre à partir du pointeur du chiffre ? Quelqu'un a-t-il une approche intelligente à ce sujet ?

Veuillez résister à la tendance de commencer une réponse par la phrase "Pourquoi ne pas simplement...". La réponse à cette question est que ce n'était pas une approche évidente pour moi. Je suis un peu novice en la matière.

3voto

Joe Kington Points 68089

Je ne comprends peut-être pas ce que vous faites... Si vous voulez juste sauvegarder la figure, pourquoi ne pas utiliser la fonction fig de l'objet savefig méthode ?

pyplot.savefig sauvegarde la figure active, mais l'utilisation de la fonction fig.savefig enregistre cette figure particulière, quelle que soit celle qui est active.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

figures = [plt.figure() for _ in range(10)]

for i, fig in enumerate(figures):
    ax = fig.add_subplot(111)
    ax.plot(x, i*x)
    ax.axis('equal')

for i, fig in enumerate(figures):
    fig.savefig('temp_slope_%02i.png' % i)

2voto

Blair Points 6090

Il se peut que quelque chose m'échappe (je ne suis pas vraiment un utilisateur de matplotlib), mais ne stockez-vous pas les objets figures eux-mêmes dans le dictionnaire ? Si c'est le cas, vous pouvez itérer sur les clés et les valeurs en utilisant for key, value in self.figures.items() puis obtenir le numéro du chiffre à l'aide de la fonction number attribut.

À titre de test, j'ai essayé ce qui suit en utilisant l'interpréteur interactif :

>>> import matplotlib.pyplot as plt
>>> figures = {}
>>> figures['name1'] = plt.figure()
>>> plt.plot([1, 2, 3])
>>> figures['name2'] = plt.figure()
>>> plt.plot([6, 5, 4])
>>> for key, figure in figures.items():
...     print 'Saving figure #%d as %s.' % (figure.number, key)
...     plt.figure(figure.number)
...     plt.savefig(key)
...
Saving figure #2 as name2
Saving figure #1 as name1

Et cela a semblé fonctionner : 2 tracés (un monotone croissant et un monotone décroissant) ont été enregistrés sous les fichiers PNG name1.png et name2.png dans le répertoire courant.

1voto

senderle Points 41607

Vous pouvez obtenir le numéro de la figure à partir de l'instance de la figure. Extrait de la documentation :

Les objets figure renvoyés ont un attribut number qui contient ce numéro.

Pour accéder à un chiffre par numéro, vous pouvez donc procéder comme suit :

figure(self.figures[fig].number)

Je n'ai pas installé matplotlib pour l'instant afin de tester cela.

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