python - ¿Semántica exacta del “modo interactivo” de Matplotlib(ion(), ioff())?
interactive-mode (2)
La documentación para el "modo interactivo" en la gráfica de puntos de Matplotlib dice:
La propiedad interactiva de la interfaz pyplot controla si se dibuja un lienzo de figura en cada comando de pyplot. Si interactivo es Falso, entonces el estado de la figura se actualiza en cada comando de trazado, pero solo se dibujará en llamadas explícitas a draw (). Cuando interactivo es verdadero, entonces cada comando pyplot desencadena un empate.
Esto parece suficientemente claro: cuando el modo interactivo está activado, se puede hacer plot()
sin tener que hacer draw()
. Sin embargo, hacer draw () en el siguiente código no hace nada:
from matplotlib import pyplot as pp
# Interactive mode is off by default
pp.plot([10, 20, 50])
pp.draw()
raw_input(''Press enter...'') # No graph displayed?!!
(En Windows XP, Matplotlib 1.0.1).
Al añadir ion()
al principio, aparecen las figuras, mientras se espera que el usuario escriba enter (lo que cierra todas las cifras):
from matplotlib import pyplot as pp
ion()
pp.plot([10, 20, 50]) # No draw() is necessary
raw_input(''Press enter...'') # The graph is interactive *and* the terminal responds to enter
Por lo tanto, parece que ion()
hace más que solo agregar actualizaciones automáticas de gráficos después de cada comando de trazado, y desafortunadamente no puedo encontrar nada en la documentación. Otro problema más importante con este último programa es que ion()
hace que todos los comandos de trazado actualicen el gráfico, lo cual consume mucho tiempo cuando un solo gráfico se actualiza varias veces.
Entonces, ¿hay una manera de:
- teniendo el terminal en espera para entrar, después de lo cual todas las cifras se cierran automáticamente,
- tener gráficos interactivos de matplotlib,
- ... ¿sin forzar que el modo interactivo esté activado al principio (para no forzar las actualizaciones automáticas de los gráficos, lo que podría llevar mucho tiempo)?
Aquí está el resumen de una discusión interesante sobre este tema en la lista de correo de Matplotlib. El resumen ejecutivo es:
El modo interactivo (activado con
ion()
) automatiza muchas cosas. En particular, los comandospyplot.*
Actualizan automáticamente en la pantalla los ejes relevantes. Sin embargo, las llamadas de método en objetos Matplotlib comoax.plot()
(siendo un objeto Axes) normalmente no se realizan actualizaciones automáticas; en este caso,pyplot.draw()
realiza la actualización necesaria.El modo no interactivo es menos conveniente.
draw()
normalmente no actualiza la figura en la pantalla. El hecho de quedraw()
esté algo "inactivo" en el modo no interactivo no se menciona en la documentación actual, pero es de esperar que se incluya allí pronto.
Mientras tanto, se puede encontrar más información sobre los modos interactivos y no interactivos en una rama actual de Matplotlib. Una mejor documentation para draw()
, show()
y amigos también se puede encontrar en la misma rama.
Le sugiero que siga el último comentario de ''Thomas K''. Recuerdo una pregunta similar en la lista de correo, pero no pude encontrarla después de varios minutos de búsqueda. Lo siento.
También tuve este problema y la mejor manera más fácil para mí fue / es usar ipython --pylab
. Tengo una versión mucho más antigua de matplotlib instalada que tiene algunos problemas con ion()
. Además de esto, matplotlib también tuvo algunos problemas con draw()
en Windows. Tal vez fue arreglado en las últimas versiones.
ps: lo siento, no pude ayudarte realmente bien.
Atentamente.