Rickard Nilsson
Rickard Nilsson

Reputation: 23

What am I doing wrong with my matplotlib ArtistAnimation?

Im trying to create an animation using the following code but I can't get it to work.

def plotSimulation(currentState, startState):
   import matplotlib.pyplot as plt
   import matplotlib.animation as ani
   import numpy as np
   import matplotlib.patches as mpatches
   import matplotlib.collections as collections

   fig1 = plt.figure()
   ax = plt.subplot()

   numberOfFrames = currentState.shape[2]


   frames = []

   for frame in np.arange(numberOfFrames):
      carPatches = []
      for car in range(0, currentState.shape[0]):
          carPatches.append(mpatches.Rectangle([currentState[car,0,frame],currentState[car,1,frame]], startState[car, 2], startState[car, 3], angle=startState[car, 4]))
      carCollection = collections.PatchCollection(carPatches)
      frames.append((carCollection,))


   simulationAnimation = ani.ArtistAnimation(fig1, frames, interval=50, repeat_delay=300, blit=False)

   plt.show()

I have tried to copy from this example http://matplotlib.org/examples/animation/basic_example.html

The animation showing in fig2

But when I try to run my animation i get:

File "...plotIteration.py", line 24, in plotSimulation
  simulationAnimation = ani.ArtistAnimation(fig1, frames, interval=50, repeat_delay=300, blit=False)

File ".../python/matplotlib/animation.py", line 934, in __init__
  TimedAnimation.__init__(self, fig, *args, **kwargs)

File ".../python/matplotlib/animation.py", line 878, in __init__
  *args, **kwargs)

File ".../python/matplotlib/animation.py", line 559, in __init__
  self._init_draw()

File ".../Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/animation.py", line 948, in _init_draw
  ax.figure.canvas.draw()

AttributeError: 'NoneType' object has no attribute 'figure'

Upvotes: 2

Views: 796

Answers (1)

tmdavison
tmdavison

Reputation: 69116

I think the problem is that you have created your PatchCollections, but haven't added them to the axes. You should be able to do this with ax.add_collection

Try changing the line appending carCollection to frames to something like:

frames.append(ax.add_collection(carCollection))

Upvotes: 2

Related Questions