Saltar al contenido

¿Cómo actualizar un gráfico en matplotlib?

Por fin después de mucho luchar pudimos encontrar la contestación de este rompecabezas que tantos usuarios de nuestro espacio tienen. Si quieres compartir algún detalle no dejes de dejar tu comentario.

Solución:

Básicamente tienes dos opciones:

  1. Haz exactamente lo que estás haciendo actualmente, pero llama graph1.clear() y graph2.clear() antes de volver a graficar los datos. Esta es la opción más lenta, pero más simple y más robusta.

  2. En lugar de volver a trazar, puede simplemente actualizar los datos de los objetos de la trama. Deberá realizar algunos cambios en su código, pero esto debería ser mucho, mucho más rápido que volver a trazar las cosas cada vez. Sin embargo, la forma de los datos que está trazando no puede cambiar, y si el rango de sus datos está cambiando, deberá restablecer manualmente los límites de los ejes x e y.

Para dar un ejemplo de la segunda opción:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 6*np.pi, 100)
y = np.sin(x)

# You probably won't need this if you're embedding things in a tkinter plot...
plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, 'r-') # Returns a tuple of line objects, thus the comma

for phase in np.linspace(0, 10*np.pi, 500):
    line1.set_ydata(np.sin(x + phase))
    fig.canvas.draw()
    fig.canvas.flush_events()

También puede hacer lo siguiente: esto dibujará una matriz aleatoria de datos de 10×1 en el gráfico durante 50 ciclos del bucle for.

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
for i in range(50):
    y = np.random.random([10,1])
    plt.plot(y)
    plt.draw()
    plt.pause(0.0001)
    plt.clf()

Esto funcionó para mí. Llama repetidamente a una función que actualiza el gráfico cada vez.

import matplotlib.pyplot as plt
import matplotlib.animation as anim

def plot_cont(fun, xmax):
    y = []
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)

    def update(i):
        yi = fun()
        y.append(yi)
        x = range(len(y))
        ax.clear()
        ax.plot(x, y)
        print i, ': ', yi

    a = anim.FuncAnimation(fig, update, frames=xmax, repeat=False)
    plt.show()

“fun” es una función que devuelve un número entero. FuncAnimation llamará repetidamente a “actualizar”, lo hará “xmax” veces.

Al final de todo puedes encontrar los comentarios de otros sys admins, tú además eres capaz mostrar el tuyo si lo crees conveniente.

¡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 *