2017-07-17 255 views
1

我想要遵循位於here的基本動畫教程,並調整它以顯示一個已經計算好的數據集,而不是每幀評估一個函數,但是會陷入困境。我的數據集涉及一段時間內的XY座標,包含在列表satxpossatypos中我試圖創建一個動畫,以便從數據集開始處到最後一行開始追蹤一行,每0.1秒顯示一個新點。任何幫助,我要去哪裏錯了?matplotlib動畫散點圖

from matplotlib import pyplot as plt 
from matplotlib import animation 
import numpy as np 

Code here creates satxpos and satypos as lists 

fig = plt.figure() 
ax = plt.axes(xlim=(-1e7,1e7), ylim = (-1e7,1e7)) 
line, = ax.plot([], [], lw=2) 

def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    line.set_data(satxpos[i], satypos[i]) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames = len(satxpos), interval = 1, blit=True) 

編輯:代碼運行沒有錯誤,但生成一個空白繪圖窗口,沒有顯示點/線,沒有任何動畫。該數據集正確生成並在靜態圖中可以正常顯示。

+0

這是你的全部代碼嗎?運行它時是否收到任何錯誤消息? – cosinepenguin

+0

這不是所有的代碼,生成satxpos和satypos的部分都會創建有效的數據集。我可以將這些視爲一個靜態的情節。代碼運行時沒有錯誤,但生成的圖只是一個空白窗口,沒有顯示動畫或點/線 –

+0

您在代碼中的某處使用'anim.save()'和'plt.show()'沒有分享? – cosinepenguin

回答

3

爲了「追查一條線年底開始在數據集的開頭」你會索引您的陣列包含每個時間步長多了一個元素:

line.set_data(satxpos[:i], satypos[:i]) 

(注意:!)

代碼中的其他部分看起來很好,這樣,通過上述操作,您應該可以獲得並延伸線條圖。您可能會想要將interval設置爲大於1的值,因爲這意味着1毫秒的時間步長(可能有點太快)。我想用interval = 40可能是一個好的開始。

+0

解決了它,完全按照我現在的意圖工作。謝謝! –

1

您的代碼看起來正確!只要satxpos和satypos都正確配置和初始化,我相信其他一切都是有效的!

你不要在你的問題顯示代碼的一部分是的anim.save()plt.show()功能,都需要爲您的代碼工作調用(按照您共享的教程!)

你會因此需要添加如下內容:

anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264']) 

plt.show() 

到您的代碼的結尾創建動畫(並顯示它,我假設)!

希望它有幫助!

Source - Matplotlib Animation Tutorial

1

我看到你所提到的「生成satxpos和satypos做創建有效的數據集的部分。我可以查看那些作爲靜態情節就好了」。但我的猜測仍然是來自您的satxpossatypos的問題。

解決問題的一種方法是用line.set_data(satxpos[i], satypos[i])替換你的兩個函數和動畫代碼。將i設置爲0,1,...並查看您是否可以看到該圖。如果不是,您的satxpossatypos不像您聲稱的那樣有效。

舉個例子,一個有效的satxpossatypos可以是這樣的:

x = np.array([np.linspace(-1e7, 1e7, 1000)]) 
i = 200 
satxpos = x.repeat(i, axis=0) 
satypos = np.sin(2 * np.pi * (satxpos - 0.01 * np.arange(i).reshape(-1, 1).repeat(satxpos.shape[1], axis=1))) 
satypos *= 1e7/2 

這個工程的代碼,你只要從而表明您已經證明了我們的代碼是好的。

編輯迴應評論:

如果您satxpossatypos只是np.linespace,動畫循環將得到的只是一個點與(satxpos[i], satypos[i]),你不會看到在圖上點不一樣marker='o'的設置。因此,你在動畫中看不到任何東西。