I am trying to animate a vector such as wind in Python. I tried to use quiver function in pylab and in combination with matplotlib.animation from matplotlib. However, the result says 'QuiverKey' object is not subscriptable
. I think that it is because I don't understand fully about these two functions or just these two functions don't match together. Below is my code, it is actually the combination between quiver and animation functions from matplotlib.
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()
You can create animations in Python by calling a plot function inside of a loop (usually a for-loop). The main tools for making animations in Python is the matplotlib. animation. Animation base class, which provides a framework around which the animation functionality is built.
In this article, we are going to discuss how to plot a vector field in python. In order to perform this task we are going to use the quiver() method and the streamplot() method in matplotlib module. Where X, Y define the Vector location and U, V are directional arrows with respect of the Vector location.
Here's an example to get you started:
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With