¿Hay alguna manera de separar los gráficos de matplotlib para que el cálculo pueda continuar?
Después de estas instrucciones en el intérprete de Python, aparece una ventana con un gráfico:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Desafortunadamente, no sé cómo continuar explorando interactivamente la figura creada show()
mientras el programa realiza más cálculos.
¿Es posible en absoluto? A veces los cálculos son largos y sería útil realizarlos durante el examen de los resultados intermedios.
Utilice matplotlib
las llamadas de que no se bloqueen:
Usando draw()
:
from matplotlib.pyplot import plot, draw, show
plot([1,2,3])
draw()
print('continue computation')
# at the end call show to ensure window won't close.
show()
Usando el modo interactivo:
from matplotlib.pyplot import plot, ion, show
ion() # enables interactive mode
plot([1,2,3]) # result shows immediatelly (implicit draw())
print('continue computation')
# at the end call show to ensure window won't close.
show()
Utilice la palabra clave 'bloquear' para anular el comportamiento de bloqueo, por ejemplo
from matplotlib.pyplot import show, plot
plot(1)
show(block=False)
# your code
para continuar con su código.
Es mejor consultar siempre con la biblioteca que está utilizando si admite el uso sin bloqueo .
Pero si quieres una solución más genérica, o si no hay otra manera, puedes ejecutar cualquier cosa que bloquee en un proceso separado usando el multprocessing
módulo incluido en Python. El cálculo continuará:
from multiprocessing import Process
from matplotlib.pyplot import plot, show
def plot_graph(*args):
for data in args:
plot(data)
show()
p = Process(target=plot_graph, args=([1, 2, 3],))
p.start()
print 'yay'
print 'computation continues...'
print 'that rocks.'
print 'Now lets wait for the graph be closed to continue...:'
p.join()
Esto tiene la sobrecarga de iniciar 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 de )
Intentar
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show(block=False)
# other code
# [...]
# Put
plt.show()
# at the very end of your script to make sure Python doesn't bail out
# before you finished examining.
La show()
documentación dice:
En modo no interactivo, muestra todas las figuras y bloquea hasta que se hayan cerrado las figuras; en el modo interactivo no tiene ningún efecto a menos que las figuras se hayan creado antes de cambiar del modo no interactivo al interactivo (no recomendado). En ese caso muestra las cifras pero no bloquea.
Un único argumento de palabra clave experimental, bloque, se puede establecer en Verdadero o Falso para anular el comportamiento de bloqueo descrito anteriormente.