Saltar al contenido

Trazar de forma no bloqueante con Matplotlib

Solución:

Pasé mucho tiempo buscando soluciones y encontré esta respuesta.

Parece que, para obtener lo que tú (y yo) queremos, necesitas la combinación de plt.ion(), plt.show() (no con block=False) y más importante, plt.pause(.001) (o cuando quieras). La pausa es necesaria porque los eventos de la GUI ocurren mientras el código principal está inactivo, incluido el dibujo. Es posible que esto se implemente tomando el tiempo de un hilo inactivo, así que tal vez los IDE se metan con eso, no lo sé.

Aquí hay una implementación que me funciona en python 3.5:

import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()


Un truco simple que me funciona es el siguiente:

  1. Utilizar el block = False argumento dentro del espectáculo: plt.show (block = False)
  2. Usar otro plt.show () al final del script .py.

Ejemplo:

import matplotlib.pyplot as plt

plt.imshow(add_something)
plt.xlabel("x")
plt.ylabel("y")

plt.show(block=False)

#more code here (e.g. do calculations and use print to see them on the screen

plt.show()

Nota: plt.show() es la última línea de mi guión.

Puede evitar bloquear la ejecución escribiendo el gráfico en una matriz y luego mostrando la matriz en un hilo diferente. Aquí hay un ejemplo de generación y visualización de gráficos simultáneamente usando pf.screen de pyformulas 0.2.8:

import pyformulas as pf
import matplotlib.pyplot as plt
import numpy as np
import time

fig = plt.figure()

canvas = np.zeros((480,640))
screen = pf.screen(canvas, 'Sinusoid')

start = time.time()
while True:
    now = time.time() - start

    x = np.linspace(now-2, now, 100)
    y = np.sin(2*np.pi*x) + np.sin(3*np.pi*x)
    plt.xlim(now-2,now+1)
    plt.ylim(-3,3)
    plt.plot(x, y, c="black")

    # If we haven't already shown or saved the plot, then we need to draw the figure first...
    fig.canvas.draw()

    image = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
    image = image.reshape(fig.canvas.get_width_height()[::-1] + (3,))

    screen.update(image)

#screen.close()

Resultado:

Animación sinusoidal

Descargo de responsabilidad: soy el mantenedor de pyformulas.

Referencia: Matplotlib: guardar gráfico en matriz numpy

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *