2017-12-06 28 views
0

異なるパラメータでFuncAnimationを複数回実行しようとしていますが、シミュレーションの最初の実行が終了するたびにプログラム全体が停止します。 FuncAnimationの最初の実行後に呼び出す関数を実行することさえありません。forループの異なるパラメータでFuncAnimationを複数回実行する

T = [1,2,4,8] 
    N = [20,40,60,80] 
    for j in N: 
     for k in T: 
      anim = animation.FuncAnimation(fig,drawNext,interval = 10, frames = 300, repeat = False) 
      plt.show() 
      idealgas() 
      count += 1 

実行が完了するとFuncAnimationはプログラム全体を停止しますか?私はそれを他の関数が呼び出されるように一定時間後に終了させたい場合は、繰り返しをfalseに設定し、forループを反復します。しかし、今の時点では、指定した時間までアニメートされ、その後は何も起こりません。私はidealgas()関数でprintステートメントをチェックし、決してプリントしないので、決してそこに到達しないと仮定しています。必要に応じてより多くの文脈を提供することができますが、このプログラムのjistは、ボールと温度の変化する数のボックスの理想気体定数を求めることです。事前に助けてくれてありがとう、私はStackOverflowの初心者ですので、私は簡単に行く。

答えて

1

原則としてループ内に新しい図形を作成できます。その後、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() 
関連する問題