¿Hay alguna manera de separar los gráficos de matplotlib para que el cálculo pueda continuar?

Resuelto meteore asked hace 15 años • 21 respuestas

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.

meteore avatar Jan 19 '09 23:01 meteore
Aceptado

Utilice matplotliblas 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()
nosklo avatar Jan 19 '2009 16:01 nosklo

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.

Jan avatar Nov 13 '2012 13:11 Jan

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 multprocessingmó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 matplotliblas llamadas API sin bloqueo de )

nosklo avatar Jan 19 '2009 16:01 nosklo

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.

Nico Schlömer avatar Jan 18 '2013 11:01 Nico Schlömer