Matplotlib actualizando plot en vivo

Quiero actualizar un trazado de líneas con matplotlib y wonder, si hay una buena modificación del código, de manera que la línea trazada simplemente se actualice en lugar de volver a dibujarla cada vez. Aquí hay un código de ejemplo:

import matplotlib.pyplot as plt import numpy as np import pandas as pd matplotlib.style.use('ggplot') plt.ion() fig=plt.figure() i=0 df = pd.DataFrame({"time": [pd.datetime.now()], "value": 0}).set_index("time") plt.plot(df); while True: temp_y=np.random.random(); df2 = pd.DataFrame({"time": [pd.datetime.now()], "value": temp_y}).set_index("time") df = df.append(df2) plt.plot(df) i+=1 plt.show() plt.pause(0.000001) 

Como puede ver, el trazado se vuelve más y más lento después de un tiempo y creo que el gráfico de líneas se vuelve a dibujar en cada iteración, ya que cambia de color.

Sí.

 x = np.arange(10) y = np.random.rand(10) line, = plt.plot(x,y) line.set_data(x,np.random.rand(10)) plt.draw() 

Sin embargo, su trazado se vuelve más lento debido a que está extendiendo su dataframe y cada operación de adición presumiblemente copia ese marco en la memoria a una nueva ubicación. A medida que su dataframe aumenta de tamaño, la operación de copia tarda más tiempo. for ii in range(len(data)): line.set_data(x[:ii], y[:ii]) un índice y un gráfico que ( for ii in range(len(data)): line.set_data(x[:ii], y[:ii]) )

EDITAR:

 import numpy as np import matplotlib.pyplot as plt; plt.ion() import pandas as pd n = 100 x = np.arange(n) y = np.random.rand(n) # I don't get the obsession with pandas... df = pd.DataFrame(dict(time=x, value=y)) # initialise plot and line line, = plt.plot(df['time'], df['value']) # simulate line drawing for ii in range(len(df)): line.set_data(df['time'][:ii], df['value'][:ii]) # couldn't be bothered to look up the proper way to index in pd plt.draw() plt.pause(0.001)