Animating Donuts in Matplotlib

Viewed 105

I am doing a small animation for a teaching course in which I need to draw a donut that moves around following a trajectory. However, I am having a problem with funcAnimation insofar as I don't manage to use blit to refresh the position. Here is my code with an example dataset

 import numpy as np

 
 x1 = np.random.randint(1,101,10)
 y1 = np.random.randint(1,101,10)

The animation itself is done by

%matplotlib inline  

import numpy as np
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML



fig, ax = plt.subplots()

def make_circle(r,x_c,y_c):
    t = np.arange(0, np.pi * 2.0, 0.01)
    t = t.reshape((len(t), 1))
    x = r * np.cos(t) + x_c
    y = r * np.sin(t) + y_c
    return np.hstack((x, y))

def draw_donut(r_o,r_i,x_c,y_c):
    Path = mpath.Path
    inside_vertices = make_circle(r_i,x_c,y_c)
    outside_vertices = make_circle(r_o,x_c,y_c)
    codes = np.ones(len(inside_vertices), dtype=mpath.Path.code_type) * mpath.Path.LINETO
    codes[0] = mpath.Path.MOVETO
    vertices = np.concatenate((outside_vertices[::1],inside_vertices[::-1]))
    all_codes = np.concatenate((codes, codes))
    path = mpath.Path(vertices, all_codes)
    patch = mpatches.PathPatch(path, facecolor='#885500', edgecolor='black')
    return patch

def animate(i):
    return ax.add_patch(draw_donut(10,5,x1[i],y1[i]))

anim = animation.FuncAnimation(fig, animate, frames = 10, interval=100, blit = False)

ax.set_xlim(-100, 100)
ax.set_ylim(-100, 100)
ax.set_aspect(1.0)

HTML(anim.to_jshtml())  

If I set blit = True I get the error

TypeError: 'PathPatch' object is not iterable

blit = False just keep plotting more donuts. Any idea how to solve this?

0 Answers
Related