У меня есть симуляция, которая вычисляет данные поверхности для каждой итерации симуляции.Я хотел бы непрерывно отображать эти данные как поверхностный график в одном и том же окне (обновляя график на каждой итерации), чтобы увидеть, как он развивается, и проверить алгоритм.
Моя идея заключалась в создании классаэто инициализирует окно / график, а затем перерисовывает это окно из цикла симуляции.Вот класс, который я придумал:
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)
Проблема, с которой я столкнулся в этом коде, заключается в том, что код останавливается на 'plt.show ()' и продолжается только после закрытия графика.окно.Также я не уверен, что вызовы «self.ax.plot_surface (...)» и «plt.draw ()» обновят рисунок так, как мне бы хотелось.
Так что этот классправильное направление?
Если да: какие изменения необходимы?
Если нет: Может кто-нибудь дать мне совет, как добиться того, чего я хочу?
Я понимаю, что эта проблемаможет показаться банальным для других, но я (честно) вчера провел весь день в Google и пытался, и я в растерянности ...
Любая помощь будет принята с благодарностью, так что я могу вернуться кмоя настоящая работа.
Танки много заранее.
Для справки:
Я также нашел следующий код, который делает то, что я хочу, но это в 2D,так что это не поможет мне напрямую:
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)