2012-11-20 70 views
1

我剛開始一個小型模擬器,我想擴展來解決一些物理問題,但是我嘗試對它們進行動畫處理時遇到問題。基本上取決於你選擇什麼樣的隨機分佈,粒子將在給定長度的區域「振盪」。我想在前面的10個步驟中顯示粒子的「歷史」。Matplotlib粗略動畫,顯示跟蹤

下面是代碼

from numpy import * 
import matplotlib.pyplot as plt 
import pylab 
import time 

pylab.ion() 

N = 10 
r = random.randint(-100,100,2*N).reshape(N,2) 
line, = plt.plot(r[:,0], r[:,1],'o') 

for i in range(100000): 
    newdatax = r[:,0] + random.rand(N) 
    newdatay = r[:,1] + random.rand(N) 
    line.set_ydata(newdatay) 
    line.set_xdata(newdatax) 
    plt.title("At timestep: %d" %i) 
    plt.hold(True) 
    plt.draw() 
    time.sleep(1.0/30) 

我要的是爲線更新不清除畫布,並在每次迭代重繪,我只是希望它做的說,每10幀(迭代) ,這將使我更容易在視覺上追蹤顆粒。

還有一件事我希望實現,但並非嚴格必要,是否可以在每個「o」周圍繪製一個方框或一個圓或三角形?這樣點就在那個盒子/圓圈/三角形的中心?這將再次使跟蹤粒子更容易。如果我能指定哪個「o」(點)得到這個屬性(方形),那將會更好。

回答

2

嘗試animation module。也看到這真棒tutorialMatplotlib animate over an image(大多是我的答案的複製和過去Animate drawing networkx edges

爲了得到你想要的時間差,就需要建立一個歷史數據結構是這樣的:

from matplotlib import animation 

fig = figure() 
N = 10 
r = random.randint(-100,100,2*N).reshape(N,2) 
line, = plt.plot(r[:,0], r[:,1],'o') 


lag_len = 10 
history_x = np.zeros((N,lag_len)) 
history_y = np.zeros((N,lag_len)) 
trails = [plot(hx,hy)[0] for hx,hy in zip(history_x,history_y)] 

def update_frame(i): 
    frame_num = i 
    newdatax = r[:,0] + random.rand(N) 
    newdatay = r[:,1] + random.rand(N) 
    line.set_ydata(newdatay) 
    line.set_xdata(newdatax) 
    history_x[:,frame_num%lag_len] = newdatax 
    history_y[:,frame_num%lag_len] = newdatay 
    for hx,hy,ln_h in zip(history_x,history_y,trails): 
     ln_h.set_xdata(hx) 
     ln_h.set_ydata(hy) 

    plt.title("At timestep: %d" %i) 
    plt.hold(True) 
    return (line,) + tuple(trails) 

anim = animation.FuncAnimation(fig, update_frame, 
          frames=100, interval=20) 

至於箱子,請使用RectangleDraw rectangle (add_patch) in pylab mode),並將可選參數傳遞給FuncAnimation

這並不完美,它有一些奇怪的細節,它循環回自身(一個循環中的第50幀與下一次它經過時第50幀不同),前10個當歷史中有一堆零時,可以修改幀(可以通過初始化歷史數組將其初始化爲10個初始點)

+0

太棒了!將明天測試這個,希望它能起作用。 – arynaq