2011-05-16 16 views
8

He conservado un conjunto de referencias a figuras en un diccionario para poder guardarlas más adelante si así lo desea. Me preocupa que las cifras guardadas estén en blanco si se invoca un comando show() y las veo primero. Desde los show() bloques de comandos y no estoy usando un intérprete de spyder-como, tengo que cerrar las cifras antes de llegar a savefig()figuras matplotlib que desaparecen entre show() y savefig()

figures['myfig_1'] = figure() 
... 
figures['myfig_n'] = figure() 
... 

#show() #disabling this makes the problem go away 
print "Saving:" 
for fig in figures: 
    figure(figures[fig].number) 
    savefig(fig) 
    print "Figure " + str(figures[fig].number) + ": " + fig 

La sentencia print aquí me ha dado la indicación de que el diccionario está todavía intacta, que creo que significa que no he perdido las referencias de figura (todavía están devolviendo números significativos en su atributo .number)

Otro giro que he notado es que cuando he hecho algo similar en una clase, guardo el diccionario como miembro y dividiendo la tienda y guardando las funciones en sus propios métodos, esto no sucede. ¿Hay algo en la forma en que estoy cerrando las cifras o almacenando los datos que hacen que las cifras pierdan sus datos?

+0

Encontré una respuesta, pero no puedo agregarla durante 8 horas. Ratas ... La versión corta es que cambié mi backend de representación a 'TkAgg' por ahora hasta que descubro cómo hacer para que Qt4Agg se comporte de la manera que me gustaría. – 2NinerRomeo

Respuesta

2

Desde el documentation, si los elementos de dibujo se destruyen o no desde show() depende de backend y de la versión de matplotlib. No tener las figuras destruidas parece estar disponible con la versión 1.1.0. Para averiguar which backend is in use, use la función get_backend(). En mi caso, estaba usando el backend de Qt4Agg. Al invocar el backend de TkAgg, con la llamada matplotlib.use('TkAgg') las cifras no se destruyeron antes del guardado. Ahora para descubrir cómo cambiar el comportamiento del Qt4Agg ...

+0

¡Agradable! No me di cuenta de que ... Los backends que uso (principalmente TkAgg) no destruyen la figura cuando llamas al show. No sabía que algunos lo hicieron. Simplemente salté a la suposición de que estabas borrando la figura cuando llamaste 'figure (figures [fig] .number)'.A pesar de todo, me resulta mucho más fácil seguir con la interfaz OO y no confiar en hacer figuras activas. –

+0

Por cierto, probablemente debería marcar su respuesta como corregida, ya que resolvió su propio problema. Es perfectamente aceptable hacerlo, aunque creo que tendrá que esperar 2 días para marcar su propia respuesta como la aceptada. –

+0

Sí, me dice que todavía tengo 23 horas para marcar mi propia respuesta. – 2NinerRomeo

7

En general, en casos como este no utilice la interfaz de máquina de estado interactiva de matlab-ish para matplotlib. Es para uso interactivo.

Está tratando de hacer una figura "activa", y crear una nueva figura en su lugar. No importa qué figura esté activa, si solo conserva la figura y/o los objetos de eje devueltos y los usa directamente. (! Además, no utilice las importaciones de carácter comodín que se arrepentir en algún momento más tarde, cuando usted está manteniendo su código!)

Sólo hacer algo como esto:

import matplotlib.pyplot as plt 
figures = {} 

figures['a'] = plt.figure() 
ax = figures['a'].add_subplot(111) 
ax.plot(range(10), 'ro-') 

figures['b'] = plt.figure() 
ax = figures['b'].add_subplot(111) 
ax.plot(range(10), 'bo-') 

plt.show() 

for name, fig in figures.iteritems(): 
    fig.savefig('figure-%s.png' % name) 
+0

Mi novedad está saliendo aquí, ni siquiera sabía que había una forma tan ingeniosa de iterar las claves y los valores simultáneamente. También estoy de acuerdo con el problema de importación de comodines. Estoy en un nuevo entorno con una cultura de 'git er done'. Además de abrir la posibilidad de colisiones de nombres, hace más difícil saber de dónde viene la funcionalidad. – 2NinerRomeo

+0

He cambiado mis formas, ahora usando el enfoque .iteritems(), pero me estoy encontrando con el mismo problema: después de un show(), las figuras parecen borrarse después de cerrar la ventana interactiva. El intérprete se detiene en el comando .savefig y pasa por una pila de llamadas de print_figure.draw() draw.update() donde me dice que el objeto c/C++ subyacente ha sido eliminado. – 2NinerRomeo

+0

El enfoque de "máquina de estado" parece funcionar. Sin la función pyplot.show(), las cifras se recuperan y se guardan correctamente. Si se muestran, luego se cierran, entonces se pierden. No sé si esto es parte de la intención de pyplot.show() pero parece ser lo que está sucediendo. No sé si es un factor, pero estoy importando un paquete llamado pylab que supongo que me está dando pyplot, pero realmente no lo sé. – 2NinerRomeo

Cuestiones relacionadas