Con Matplotlib anterior a la versión 1.0.1, show()
should only be called once per program, incluso si parece funcionar en ciertos entornos (algunos backends, en algunas plataformas, etc.).
la función de dibujo relevante es en realidad draw()
:
import matplotlib.pyplot as plt
plt.plot(range(10)) # Creates the plot. No need to save the current figure.
plt.draw() # Draws, but does not block
raw_input() # This shows the first figure "separately" (by waiting for "enter").
plt.figure() # New window, if needed. No need to save it, as pyplot uses the concept of current figure
plt.plot(range(10, 20))
plt.draw()
# raw_input() # If you need to wait here too...
# (...)
# Only at the end of your program:
plt.show() # blocks
Es importante reconocer que show()
es un bucle infinito, diseñado para manejar eventos en las diferentes figuras (cambiar el tamaño, etc.). Tenga en cuenta que, en principio, las llamadas a draw()
son opcionales si llama al matplotlib.ion()
al comienzo de la secuencia de comandos (aunque he visto esto fallar en algunas plataformas y backends).
No creo que Matplotlib ofrezca un mecanismo para crear una figura y mostrarla opcionalmente; esto significa que se mostrarán todas las figuras creadas con figure()
. Si solo necesita mostrar secuencialmente las figuras (ya sea en la misma ventana o no), puede hacer lo mismo en el código anterior.
Ahora, la solución anterior podría ser suficiente en casos simples, y para algunos backends Matplotlib. Algunos backends son lo suficientemente agradables para permitirle interactuar con la primera figura aunque no haya llamado al show()
. Pero, por lo que yo entiendo, no tienen que ser agradables. El enfoque más sólido sería lanzar cada dibujo de figura en un hilo separado, con un show()
final en cada hilo. Creo que esto es esencialmente lo que hace IPython.
El código anterior debería ser suficiente la mayor parte del tiempo.
PS: ahora, con Matplotlib versión 1.0.1+, show()
se puede llamar varias veces (con la mayoría de los backends).
Solo un consejo: en general, no es necesario que guarde las cifras (en f1, f2), ya que Matplotlib dibuja en la figura * actual *, que generalmente es la última figura creada. – EOL
@EOL, ¿y si quiero dibujar en la primera figura? – Alcott
Hay varias formas de escribir de nuevo a una figura sin guardarla primero en una variable. Por ejemplo, todas las figuras tienen un "número" (que puede ser un número o una cadena). Por defecto, las figuras obtienen un número. Por lo tanto, 'figure (1)' hace activa la primera figura, etc. Alternativamente, puede crear una figura (sin guardarla) con 'figure ('rank')' y luego volverla a activar más tarde con 'figure (' rango ') '. Dicho esto, el punto de mi comentario fue que en el caso de esta pregunta, no hay absolutamente ninguna necesidad de guardar las cifras, ya que 'plot()' actúa sobre la figura actual (la última creada, aquí). – EOL