Tengo una simulación que calcula los datos de superficie para cada iteración de la simulación. Me gustaría trazar continuamente esos datos como un gráfico de superficie en la misma ventana (actualizando la gráfica en cada iteración) para ver cómo evoluciona y para verificar el algoritmo.trazado en 3D continuo (es decir, actualización de figura) usando python-matplotlib?
Mi idea era crear una clase que inicializara la ventana/trama y luego volver a dibujar en esa ventana desde el interior del ciclo de simulación. Aquí está la clase que se me ocurrió:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib
matplotlib.interactive(False)
class plot3dClass(object):
def __init__(self, systemSideLength, lowerCutoffLength):
self.systemSideLength = systemSideLength
self.lowerCutoffLength = lowerCutoffLength
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111, projection='3d')
self.ax.set_zlim3d(-10e-9, 10e9)
X = np.arange(0, self.systemSideLength, self.lowerCutoffLength)
Y = X
self.X, self.Y = np.meshgrid(X, Y)
self.ax.w_zaxis.set_major_locator(LinearLocator(10))
self.ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))
heightR = np.zeros(self.X.shape)
self.surf = self.ax.plot_surface(self.X, self.Y, heightR, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False)
#~ self.fig.colorbar(self.surf, shrink=0.5, aspect=5)
plt.show()
def drawNow(self, heightR):
self.surf = self.ax.plot_surface(self.X, self.Y, heightR, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False)
plt.draw() # redraw the canvas
time.sleep(1)
El problema que tengo con este código, es que el código se detiene en el 'plt.show()' y sólo continúa, cuando cierro la trama ventana. Además, no estoy seguro de si las llamadas de 'self.ax.plot_surface (...)' y 'plt.draw()' actualizarían la figura como me gustaría.
¿Es esta clase la dirección correcta?
En caso afirmativo: ¿Qué modificaciones son necesarias?
Si no: ¿Podría alguien darme consejos cómo lograr lo que quiero?
que se dan cuenta de que este problema podría parecer trivial a los demás, pero yo (honestamente) hicieron pasar todo el día de ayer en Google y tratando y estoy en una pérdida ...
Cualquier ayuda sería muy apreciada, para que pueda volver a mi trabajo real.
Tanques con mucha antelación.
Como referencia:
también encontré el siguiente código que no, lo que quiero, pero es en 2D, por lo que no me ayuda directa:
from pylab import *
import time
ion()
tstart = time.time() # for profiling
x = arange(0,2*pi,0.01) # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
line.set_ydata(sin(x+i/10.0)) # update the data
draw() # redraw the canvas
print 'FPS:' , 200/(time.time()-tstart)
esto no funciona en mi computadora (Win XP, python 2.7.3): todo lo que veo es el gráfico final –
Necesita self.fig.cances.flush_events() después de la línea plt.draw(). (crédito http://stackoverflow.com/a/4098938/415551) –