actualizar una figura hecha con imshow (), contour () y quiver ()

Me gustaría saber si se puede actualizar un contorno hecho con contour() , un campo vectorial hecho con quiver() y una imagen hecha con imshow() , sin tener que volver a llamar esas funciones o crear una nueva figura. Ejes, etc. En otras palabras, ¿es posible (y suele ser lo que hacen las personas) actualizar los elementos de una figura sin volver a llamar a las rutinas?

He intentado soluciones basadas en set_array() y pyplot.draw() pero no puedo hacer que funcione para el campo vectorial y el gráfico de contorno.

Bueno, puedes hacer esto por imshow llamando a .set_data() en la imagen, luego a fig.canvas.draw() en la figura. No veo ninguna ventaja de rendimiento real con solo llamar a draw() ; ambos me ofrecen aproximadamente 25FPS con el punto de referencia a continuación (usando WXAgg como backend).

 import numpy as np import matplotlib.pyplot as pp import time def animate_data(data): fig,ax = pp.subplots(1,1) # I'm not convinced that animated=True does anything either... image = ax.imshow(data[0,:,:],animated=True) # pp.draw() fig.canvas.draw() start = time.time() tic = start for ii in xrange(1,data.shape[0]): if not(ii % 10): toc = time.time() print "FPS =\t%.6G" %(10./(toc-tic)) tic = time.time() image.set_data(data[ii,:,:]) # pp.draw() fig.canvas.draw() print "Average FPS =\t%.6G" %(data.shape[0]/(time.time()-start)) fakedata = np.random.randn(200,512,512) animate_data(fakedata) 

En el caso de quiver , puedes usar .set_UVC() para actualizar el gráfico:

 fig,ax = subplots(1,1) u1 = np.random.rand(10,10) v1 = np.random.rand(10,10) c1 = np.random.rand(10,10) q = ax.quiver(u1,v1,c1) fig.canvas.draw() u2 = np.random.rand(10,10) v2 = np.random.rand(10,10) c2 = np.random.rand(10,10) q.set_UVC(u2,v2,c2) fig.canvas.draw() 

Por lo que puedo decir, no puede actualizar los gráficos de contour de la misma manera. De todos modos, no estoy seguro de que haya mucho que ganar, ya que cualquier solución aún requeriría una re-computación donde deberían ir las líneas de contorno para una entrada de matriz determinada. Si fuera tú, solo llamaría ax.contour() y fig.canvas.draw() .