2013-10-12 20 views
9

Tôi đang cố gắng tạo hiệu ứng cho một vectơ như gió trong Python. Tôi đã cố gắng sử dụng chức năng rung trong pylab và kết hợp với matplotlib.animation từ matplotlib. Tuy nhiên, kết quả cho biết 'QuiverKey' object is not subscriptable. Tôi nghĩ rằng đó là bởi vì tôi không hiểu đầy đủ về hai chức năng này hoặc chỉ hai chức năng này không khớp với nhau. Dưới đây là mã của tôi, nó thực sự là sự kết hợp giữa rung động và các chức năng hoạt hình từ matplotlib.Vẽ các bộ rung động trong 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

Vâng, 'dữ liệu' là một' QuiverKey' đối tượng - nó đại diện cho một chìa khóa cho một âm mưu rung động, không phải là một mảng các giá trị mà bạn có thể lập chỉ mục. Tôi thực sự không hiểu những gì bạn đang nhắm đến - bạn nói rằng bạn muốn vẽ quivers hoạt hình, nhưng chức năng hoạt hình của bạn trông giống như nó có nghĩa là chỉ cần thêm điểm vào một dòng. Bạn có thể mô tả những gì bạn đang cố gắng đạt được không? –

+0

Xin chào ali_m, tôi thực sự đánh giá cao nhận xét và trợ giúp của bạn. Mục tiêu của tôi là tạo ra một hình ảnh động mà những người quấy rầy đang di chuyển vào các hướng mũi tên. Có lẽ sự hiểu biết của tôi về cấu trúc hàm này quá thấp. Bạn sẽ giúp tôi hiểu làm thế nào tôi làm cho mỗi rung động di chuyển vào mỗi mũi tên (vector) hướng? – Isaac

+1

Tôi vẫn không hiểu ý bạn là gì. Bạn có muốn thay đổi độ dài và góc của mũi tên hay bạn muốn di chuyển điểm xoay quanh chúng? Theo như tôi biết, không có cách nào thay đổi tọa độ x, y của một âm mưu rung khi nó đã được tạo ra, nhưng bạn có thể sử dụng 'Q.set_UVC()' để cập nhật các vectơ mũi tên. –

Trả lời

11

Dưới đây là một ví dụ để giúp bạn bắt đầu:

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

Các vấn đề liên quan