我有一個模擬計算每次模擬迭代的表面數據。 我想連續將該數據作爲曲面圖繪製到同一個窗口中(更新每次迭代中的繪圖),以便了解它如何演變並檢查算法。使用python-matplotlib進行連續3D繪圖(即圖形更新)?
我的想法是創建一個類,它將初始化窗口/繪圖,然後從模擬循環內部重新繪製到該窗口。這裏是我想出了類:
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()'的調用是否會按照我的意願更新該圖。
那麼這堂課是否正確?
如果是:需要進行哪些修改?
如果不是的話:有人可以請給我建議如何實現我想要的?
我意識到這個問題似乎微不足道的人,但我(老實說)確實花了整整一天昨日在谷歌和嘗試,我不知所措......
任何幫助將不勝感激,這樣我才能回到我的實際工作。
坦克很多提前。
作爲參考:
我還發現以下代碼呢,我想要的,但它是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)
這不適用於我的電腦(Win XP,python 2.7.3):我看到的只是最終的圖 – 2012-07-25 12:44:38
它需要plt.draw()行後面的self.fig.canvas.flush_events()。 (信用http://stackoverflow.com/a/4098938/415551) – 2017-01-20 18:49:04