原則としてループ内に新しい図形を作成できます。その後、1つのFigureを閉じると、プログラムは続行され、次のFigureが作成されて表示されます。 Figureはアニメーションの終わりに自動的に閉じることができます。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def createanimatedfig(omega):
fig, ax = plt.subplots()
ax.axis([0,2*np.pi,-1,1])
ax.set_title(u"animated sin(${:g}\cdot t$)".format(omega))
t = np.linspace(0,2*np.pi)
x = np.sin(omega*t)
line, = ax.plot([],[], lw=3)
ani = FuncAnimation(fig,animate, len(t), repeat=False,
fargs=(t,x,line, len(t)), interval=20)
plt.show()
def animate(i, t,x, line, maxsteps):
line.set_data(t[:i],x[:i])
if i >= maxsteps-1:
plt.close(line.axes.figure)
omegas= [1,2,4,5]
for omega in omegas:
createanimatedfig(omega)
また、1つの図形を使用して、すべてのアニメーションを順番に表示することもできます。これは、どのアニメーションが停止するかをある程度制御する必要があるため、ステップを処理するためのクラスの使用が便利です。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
class Ani():
def __init__(self,omegas, nsteps, line):
self.nsteps = nsteps
self.omegas = omegas
self.line=line
self.step = 0
self.i = 0
def getdata(self,j):
t = np.arange(0,j)/float(self.nsteps)*2*np.pi
x = np.sin(self.omegas[self.step]*t)
return t,x
def gen(self):
for i in range(len(self.omegas)):
tit = u"animated sin(${:g}\cdot t$)".format(self.omegas[self.step])
self.line.axes.set_title(tit)
for j in range(self.nsteps):
yield j
self.step += 1
def animate(self,j):
x,y = self.getdata(j)
self.line.set_data(x,y)
fig, ax = plt.subplots()
ax.axis([0,2*np.pi,-1,1])
title = ax.set_title(u"")
line, = ax.plot([],[], lw=3)
omegas= [1,2,4,5]
a = Ani(omegas,50,line)
ani = FuncAnimation(fig,a.animate, a.gen, repeat=False, interval=60)
plt.show()