Arrow animation in Python
<p>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.</p>

<p>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 <code>circle.center = new_coordinates</code>. However, I don't find the way to extrapolate this mechanism to an arrow patch...</p>

<p>The code so far is:</p>

<pre><code>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()
</code></pre>

<p>After trying several options, I thought that the function update could somehow take me closer to the solution. However, I get the error:</p>

<pre><code>TypeError: update() takes 2 positional arguments but 5 were given
</code></pre>

<p>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.</p>

<pre><code>def animate(t):
    patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )
    ax.add_patch(patch)
    return patch,
</code></pre>

<p><a href="https://i.stack.imgur.com/fE2B1.png" rel="nofollow">Wrong animation</a></p>

<p>I have tried to add a patch.delete statement and create a new patch as update mechanism but that results in an empty animation...</p>

<p>I would be really grateful if anyone could bring some fresh air to this issue :)</p>

<p>Thanks in advance!</p>

<p>Add <code>ax.clear()</code> before <code>ax.add_patch(patch)</code> but will remove all elements from plot.</p>

<pre><code>def animate(t):

    ax.clear() 

    patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )
    ax.add_patch(patch)

    return patch,
</code></pre>

<hr>

<p><strong>EDIT:</strong> removing one patch</p>

<ul>
<li><p>using <code>ax.patches.pop(index)</code>. </p>

<p>In your example is only one patch so you can use <code>index=0</code></p>

<pre><code>def animate(t):

    ax.patches.pop(0) 

    patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )
    ax.add_patch(patch)

    return patch,
</code></pre></li>
<li><p>using <code>ax.patches.remove(object)</code></p>

<p>It needs <code>global</code> to get/set external <code>patch</code> with <code>Arrow</code></p>

<pre><code>def animate(t):

    global patch

    ax.patches.remove(patch) 

    patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )
    ax.add_patch(patch)

    return patch,
</code></pre></li>
</ul>

<hr>

<p><strong>BTW:</strong> to get list of properties which you can use with <code>update()</code></p>

<pre><code>print( patch.properties().keys() )

dict_keys(['aa', 'clip_path', 'patch_transform', 'edgecolor', 'path', 'verts', 'rasterized', 'linestyle', 'transform', 'picker', 'capstyle', 'children', 'antialiased', 'sketch_params', 'contains', 'snap', 'extents', 'figure', 'gid', 'zorder', 'transformed_clip_path_and_affine', 'clip_on', 'data_transform', 'alpha', 'hatch', 'axes', 'lw', 'path_effects', 'visible', 'label', 'ls', 'linewidth', 'agg_filter', 'ec', 'facecolor', 'fc', 'window_extent', 'animated', 'url', 'clip_box', 'joinstyle', 'fill'])
</code></pre>

<p>so you can use <code>update</code> to change color - `facecolor</p>

<pre><code>def animate(t):
    global patch

    t %= 20 # get only 0-19 to loop animation and get color t/20 as 0.0-1.0

    ax.patches.remove(patch)

    patch = patches.Arrow(x[t], y[t], dx[t], dy[t])

    patch.update({'facecolor': (t/20,t/20,t/20,1.0)})

    ax.add_patch(patch)

    return patch,
</code></pre>

python animation matplotlib arrow