2013-10-12 113 views
9

我想要在Python中爲諸如風的矢量創建動畫。我試圖在pylab中使用顫抖函數,並與來自matplotlib的matplotlib.animation一起使用。但結果說'QuiverKey' object is not subscriptable。我認爲這是因爲我不完全瞭解這兩個功能,或者只是這兩個功能不匹配。下面是我的代碼,它實際上是來自matplotlib的顫音和動畫函數之間的組合。在Python中繪製動畫顫動者

def update_line(num, data, line): 
    line.set_data(data[...,:num]) 
    return line, 

X,Y = np.meshgrid(np.arange(0,2*np.pi,.2),np.arange(0,2*np.pi,.2)) 
U = np.cos(X) 
V = np.sin(Y) 

fig1 = plt.figure() 
Q = quiver(X[::3, ::3], Y[::3, ::3], U[::3, ::3], V[::3, ::3], 
     pivot='mid', color='r', units='inches') 
data = quiverkey(Q, 0.5, 0.03, 1, r'$1 \frac{m}{s}$', fontproperties={'weight': 'bold'}) 
plt.axis([-1, 7, -1, 7]) 
title('scales with plot width, not view') 
l, = plt.plot([], [], 'r-') 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('test') 
line_ani = animation.FuncAnimation(fig1, update_line, 25, fargs=(data, l), 
interval=50, blit=True) 
plt.show() 
+1

嘛,'data'是'QuiverKey'對象 - 這是一個關鍵的情節顫抖,而不是一個數組您可以編入索引的值。我真的不明白你的目標是什麼 - 你說你想繪製動畫顫抖,但是你的動畫函數看起來只是爲了添加點而已。你能描述你想要達到的目標嗎? –

+0

嗨ali_m,我真的很感謝你的評論和幫助。我的目標是製作一個動畫,讓顫抖的人朝着箭頭的方向移動。也許我對這個功能結構的理解太低了。你能幫我理解我如何讓每個箭頭移動到每個箭頭(矢量)方向嗎? – Isaac

+1

我還是不太明白你的意思。你想改變箭的長度和角度,還是你想要移動它們的支點?據我所知,一旦創建了顫動圖,就沒有辦法改變顫抖圖的x,y座標,但是你可以使用'Q.set_UVC()'來更新箭頭矢量。 –

回答

11

下面是一個例子,讓你開始:

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

X, Y = np.mgrid[:2*np.pi:10j,:2*np.pi:5j] 
U = np.cos(X) 
V = np.sin(Y) 

fig, ax = plt.subplots(1,1) 
Q = ax.quiver(X, Y, U, V, pivot='mid', color='r', units='inches') 

ax.set_xlim(-1, 7) 
ax.set_ylim(-1, 7) 

def update_quiver(num, Q, X, Y): 
    """updates the horizontal and vertical vector components by a 
    fixed increment on each frame 
    """ 

    U = np.cos(X + num*0.1) 
    V = np.sin(Y + num*0.1) 

    Q.set_UVC(U,V) 

    return Q, 

# you need to set blit=False, or the first set of arrows never gets 
# cleared on subsequent frames 
anim = animation.FuncAnimation(fig, update_quiver, fargs=(Q, X, Y), 
           interval=50, blit=False) 
fig.tight_layout() 
plt.show() 

enter image description here