Después de estas instrucciones en el intérprete de Python, se obtiene una ventana con una trama:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Desafortunadamente, no sé cómo continuar explorando interactivamente la figura creada por show()
mientras el programa hace más cálculos.
¿Es posible en absoluto? A veces, los cálculos son largos y ayudaría si procedieran durante el examen de los resultados intermedios.
python
matplotlib
plot
meteore
fuente
fuente
ion()
soluciona el problema.os.fork()
peroos.fork()
ten en cuenta que usarlo puede ser complicado porque estás creando un nuevo proceso copiando el proceso anterior.Respuestas:
Use
matplotlib
las llamadas que no bloquearán:Utilizando
draw()
:Usando el modo interactivo:
fuente
draw()
no funciona para mí, no abre ninguna ventana. Sin embargo, usar enshow(block=False)
lugar dedraw()
parece hacer el truco en matplotlib 1.1.draw()
tampoco funcionó para mí, solo lopause(0.001)
hizo: stackoverflow.com/questions/28269157/…Use la palabra clave 'bloquear' para anular el comportamiento de bloqueo, p. Ej.
para continuar tu código.
fuente
Es mejor consultar siempre con la biblioteca que está utilizando si admite el uso sin bloqueo .
Pero si desea una solución más genérica, o si no hay otra forma, puede ejecutar cualquier cosa que bloquee en un proceso separado utilizando el
multprocessing
módulo incluido en python. La computación continuará:Eso tiene la sobrecarga de lanzar un nuevo proceso y, a veces, es más difícil de depurar en escenarios complejos, por lo que preferiría la otra solución (usar
matplotlib
las llamadas API sin bloqueo )fuente
if __name__ == '__main__':
?Tratar
La
show()
documentación dice:fuente
IMPORTANTE : Solo para aclarar algo. Supongo que los comandos están dentro de un
.py
script y se llama al script usando, por ejemplo,python script.py
desde la consola.Una forma simple que funciona para mí es:
Ejemplo de
script.py
archivo:fuente
Es posible que desee leer este documento en
matplotlib
la documentación titulada:Usando matplotlib en un shell de python
fuente
En mi caso, quería que aparecieran varias ventanas emergentes mientras se calculan. Como referencia, esta es la forma:
PD. Una guía bastante útil para la interfaz OO de matplotlib .
fuente
Bueno, tuve grandes problemas para descifrar los comandos que no bloquean ... Pero finalmente, logré reelaborar el ejemplo " Cookbook / Matplotlib / Animations - Animating selected plot elements ", por lo que funciona con hilos ( y pasa datos entre hilos a través de variables globales, o a través de un multiproceso
Pipe
) en Python 2.6.5 en Ubuntu 10.04.El script se puede encontrar aquí: Animating_selected_plot_elements-thread.py - de lo contrario se pega a continuación ( con menos comentarios ) para referencia:
Espero que esto ayude a alguien,
¡salud!
fuente
En muchos casos, es más conveniente guardar la imagen como un archivo .png en el disco duro. Aquí es por qué:
Ventajas:
Retirarse:
fuente
Si está trabajando en la consola, es decir
IPython
, podría usarplt.show(block=False)
como se indica en las otras respuestas. Pero si eres flojo, puedes escribir:Que será lo mismo.
fuente
También tuve que agregar
plt.pause(0.001)
a mi código para que realmente funcione dentro de un bucle for (de lo contrario, solo mostraría el primer y el último diagrama):fuente
En mi sistema, show () no se bloquea, aunque quería que el script esperara a que el usuario interactúe con el gráfico (y recopile datos utilizando las devoluciones de llamada 'pick_event') antes de continuar.
Para bloquear la ejecución hasta que se cierre la ventana de trazado, utilicé lo siguiente:
Sin embargo, tenga en cuenta que canvas.start_event_loop_default () produjo la siguiente advertencia:
aunque el guión todavía se ejecutó.
fuente
También quería que se mostraran mis gráficos para ejecutar el resto del código (y luego seguir mostrando) incluso si hay un error (a veces uso gráficos para la depuración). Codifiqué este pequeño truco para que cualquier trama dentro de esta
with
declaración se comporte como tal.Esto es probablemente un poco no estándar y no es aconsejable para el código de producción. Probablemente hay muchas "trampas" ocultas en este código.
Si / cuando implemente un correcto "mantener las parcelas abiertas (incluso si ocurre un error) y permitir que se muestren nuevas parcelas", me gustaría que el script salga correctamente si ninguna interferencia del usuario lo indica de otra manera (para fines de ejecución por lotes).
Puedo usar algo así como una pregunta de tiempo de espera "¡Fin del guión! \ NPresione p si desea pausar la salida de trazado (tiene 5 segundos):" de /programming/26704840/corner -cases-for-my-wait-for-user-input-interruption-implementación .
fuente
fuente
El OP pregunta por separar las
matplotlib
parcelas. La mayoría de las respuestas asumen la ejecución del comando desde un intérprete de Python. El caso de uso presentado aquí es mi preferencia para probar el código en un terminal (por ejemplo, bash) dondefile.py
se ejecuta a y desea que surjan los gráficos, pero el script de Python se complete y regrese a un símbolo del sistema.Este archivo independiente se utiliza
multiprocessing
para iniciar un proceso separado para trazar datos conmatplotlib
. El hilo principal sale usando loos._exit(1)
mencionado en esta publicación. Lasos._exit()
fuerzas principales salen, pero deja elmatplotlib
proceso hijo vivo y receptivo hasta que se cierra la ventana de la trama. Es un proceso completamente separado.Este enfoque es un poco como una sesión de desarrollo de Matlab con ventanas de figura que aparecen con un símbolo del sistema receptivo. Con este enfoque, ha perdido todo contacto con el proceso de ventana de figura, pero está bien para el desarrollo y la depuración. Solo cierra la ventana y sigue probando.
multiprocessing
está diseñado para la ejecución de código solo en python, lo que lo hace quizás más adecuado quesubprocess
.multiprocessing
es multiplataforma, por lo que debería funcionar bien en Windows o Mac con poco o ningún ajuste. No es necesario verificar el sistema operativo subyacente. Esto fue probado en Linux, Ubuntu 18.04LTS.Al ejecutar,
file.py
aparece una ventana de figura, luego__main__
sale, pero la ventana de figuramultiprocessing
+matplotlib
sigue respondiendo con zoom, panorámica y otros botones porque es un proceso independiente.Verifique los procesos en el símbolo del sistema bash con:
ps ax|grep -v grep |grep file.py
fuente
.daemon=False
como se describe aquí stackoverflow.com/a/49607287/1476932 Sin embargo,sys.exit()
no terminé el proceso primario como se describe allí hasta que cerré la ventana secundaria. Por otro lado, el usoos._exit(0)
del ejemplo anterior funcionó.En mi opinión, las respuestas en este hilo proporcionan métodos que no funcionan para todos los sistemas y en situaciones más complejas como las animaciones. Sugiero echar un vistazo a la respuesta de MiKTeX en el siguiente hilo, donde se ha encontrado un método robusto: ¿Cómo esperar hasta que termine la animación matplotlib?
fuente
Si desea abrir varias figuras, mientras las mantiene abiertas, este código funcionó para mí:
fuente
Si bien no respondo directamente a la solicitud de OP, estoy publicando esta solución, ya que puede ayudar a alguien en esta situación:
para esto estoy usando:
Donde "var" identifica la trama en el bucle para que no se sobrescriba.
fuente
Use
plt.show(block=False)
, y al final de su llamada al scriptplt.show()
.Esto garantizará que la ventana no se cierre cuando finalice el script.
fuente