2013-10-12 11 views
9

Próbuję animować wektor, taki jak wiatr w języku Python. Próbowałem użyć funkcji kołczana w pylab iw połączeniu z matplotlib.animation z matplotlib. Jednak wynik mówi: 'QuiverKey' object is not subscriptable. Myślę, że to dlatego, że nie rozumiem w pełni tych dwóch funkcji lub tylko te dwie funkcje nie pasują do siebie. Poniżej znajduje się mój kod, w rzeczywistości jest to połączenie funkcji kołczanu i animacji z matplotlib.Wykreślanie animowanych kołczanów w języku 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

Dobrze, '' data' to obiekt QuiverKey' - stanowi klucz do działki kołczan, a nie tablicy wartości, które można indeksować. Naprawdę nie rozumiem, do czego dążysz - mówisz, że chcesz rysować animowane kołczany, ale funkcja animacji wygląda tak, jakby miała tylko dodawać punkty do linii. Czy możesz opisać, co próbujesz osiągnąć? –

+0

Witaj, ali_m, naprawdę doceniam twój komentarz i pomoc. Moim celem jest stworzenie animacji, której drgania poruszają się w kierunkach strzał. Być może moje zrozumienie tej struktury funkcji jest zbyt niskie. Czy pomogłbyś mi zrozumieć, w jaki sposób poruszam każdy kołczan w kierunku każdej strzałki (wektor)? – Isaac

+1

Nadal nie rozumiem, co masz na myśli. Czy chcesz zmienić długości i kąty strzałek, czy chcesz przesunąć ich punkty obrotu? O ile mi wiadomo, nie ma możliwości zmiany współrzędnych x, y wykresu kołczanu po jego utworzeniu, ale można użyć 'Q.set_UVC()', aby zaktualizować wektory strzałek. –

Odpowiedz

11

Oto przykład, jak zacząć grę:

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