First of all, I am just starting to learn Python. I have been struggling during the last hours trying to update the arrow properties in order to change them during a plot animation.
After thoroughly looking for an answer, I have checked that it is possible to change a circle patch center by modifying the attribute 'center' such as circle.center = new_coordinates
. However, I don't find the way to extrapolate this mechanism to an arrow patch...
The code so far is:
import numpy as np, math, matplotlib.patches as patches
from matplotlib import pyplot as plt
from matplotlib import animation
# Create figure
fig = plt.figure()
ax = fig.gca()
# Axes labels and title are established
ax = fig.gca()
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_ylim(-2,2)
ax.set_xlim(-2,2)
plt.gca().set_aspect('equal', adjustable='box')
x = np.linspace(-1,1,20)
y = np.linspace(-1,1,20)
dx = np.zeros(len(x))
dy = np.zeros(len(y))
for i in range(len(x)):
dx[i] = math.sin(x[i])
dy[i] = math.cos(y[i])
patch = patches.Arrow(x[0], y[0], dx[0], dy[0] )
def init():
ax.add_patch(patch)
return patch,
def animate(t):
patch.update(x[t], y[t], dx[t], dy[t]) # ERROR
return patch,
anim = animation.FuncAnimation(fig, animate,
init_func=init,
interval=20,
blit=False)
plt.show()
After trying several options, I thought that the function update could somehow take me closer to the solution. However, I get the error:
TypeError: update() takes 2 positional arguments but 5 were given
If I just add one more patch per step by defining the animate function as shown below, I get the result shown in the image attached.
def animate(t):
patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )
ax.add_patch(patch)
return patch,
I have tried to add a patch.delete statement and create a new patch as update mechanism but that results in an empty animation...
Add
ax.clear()
beforeax.add_patch(patch)
but will remove all elements from plot.EDIT: removing one patch
using
ax.patches.pop(index)
.In your example is only one patch so you can use
index=0
using
ax.patches.remove(object)
It needs
global
to get/set externalpatch
withArrow
BTW: to get list of properties which you can use with
update()
so you can use
update
to change color - `facecolorI found this by mimicking the code in
patches.Arrow.__init__
: