I'm trying to animate two matplotlib figures at the same time. I wrote a script that creates two instances of matplotlib.animation.FuncAnimation, but only one of them animates, the other remains static.
Here's a minimum working example:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
x=np.linspace(-np.pi,np.pi,100)
# Function for making figures
def makeFigure():
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
# Plot a line
line,=ax.plot(x,np.sin(x))
return fig,ax,line
# Frame rendering function
def renderFrame(i,line):
# Apply a phase shift to the line
line.set_data(x,np.sin(x-i*2*np.pi/100))
return line,
# Make the figures
figcomps1=makeFigure()
figcomps2=makeFigure()
# Animate the figures
for figcomps in [figcomps1,figcomps2]:
fig,ax,line=figcomps
anim=animation.FuncAnimation(fig,renderFrame,fargs=[line])
plt.show()
Is FuncAnimation capable of animating two figures simultaneously? If not, is there another way to simultaneously animate two matplotlib figures?
Cause of Issue
You must track each
FuncAnimation
object separately by holding reference to each individual object.In your
for
loop, theFuncAnimation
object is being instantiated twice (with nameanim
), and hence in the namespace, effectively 'overwritten'.From the Animation Module Docs
Example Solution
Instead, tracking both
FuncAnimation
objects in, for example a list ofFuncAnimation
objects, will allow them to both be animated with their own timersI wish to stress this is only an example, as there are many other methods of tracking multiple objects in a
for
loop, as explored in this question