Animation 使用matplotlib随时间变化的1D动画

Animation 使用matplotlib随时间变化的1D动画,animation,matplotlib,Animation,Matplotlib,我以前从未尝试过用python制作动画,所以提前道歉是因为这个问题看起来很愚蠢。我在论坛上四处寻找,但很难找到任何人在做一个模拟,就像我随着时间的推移,这有一个答案,我能够理解 我有一个变量(maxfs),它是时间(t)的函数。我已经计算了h并绘制了许多1D图,我可以随着maxfs随时间的变化绘制不同的时间步,但只能通过手动更改t。然而,我在演示中展示了一些数据,出于演示目的,我想展示解决方案是如何随时间发展的。我最初的想法是对时间(t)运行for循环,计算所有点的h(这是我在MATLAB中会做

我以前从未尝试过用python制作动画,所以提前道歉是因为这个问题看起来很愚蠢。我在论坛上四处寻找,但很难找到任何人在做一个模拟,就像我随着时间的推移,这有一个答案,我能够理解

我有一个变量(maxfs),它是时间(t)的函数。我已经计算了h并绘制了许多1D图,我可以随着maxfs随时间的变化绘制不同的时间步,但只能通过手动更改t。然而,我在演示中展示了一些数据,出于演示目的,我想展示解决方案是如何随时间发展的。我最初的想法是对时间(t)运行for循环,计算所有点的h(这是我在MATLAB中会做的),但是查看Matplotlib文档中的示例,我不确定是否可以用这种方式执行动画。我在下面列出了我的代码,如果有人对我最初的想法是否是一种可行的方法或者是否有一种更好的替代方法有任何建议的话。我是python的新手,所以如果可能的话,我会寻找一个非常简单的解决方案,因为我的时间很短。提前谢谢

__author__="ahe"
__date__ ="$23-Jul-2014$"


import numpy as np
import matplotlib.pyplot as plt 
import math 
import sys
from math import sqrt  
import decimal
from sklearn.metrics import mean_square_error
from matplotlib import gridspec


t=1
l=1
d=0.088
g=9.81
l2=l**2.0

# fs1=FS(0,0)        fs2=FS(xm,0)
fs1=0.04
fs2=0.02
xm=-0.5
omega=((2*g*d)/l2)**0.5
B=g*((fs1-fs2)/(omega*xm))
C=fs1+(g*(((fs1-fs2)**2.0)/(4*omega*(xm**2.0))))


nx, ny = (101,101)
x5 = np.linspace(-2,2,nx)
y5 = np.linspace(-2,2,ny)
xv,yv = np.meshgrid(x5,y5)
x = np.arange(-2,2.04,0.04)
y = np.arange(-2,2.04,0.04)

nx2,ny2 = (111,111)
x10 = np.linspace(-2.2,2.24,nx2)
y10 = np.linspace(-2.2,2.24,ny2)
xv1,yv1 = np.meshgrid(x10,y10)
x1=np.arange(-2.2,2.22,0.04,dtype=float)
y1=np.arange(-2.2,2.22,0.04,dtype=float)
t59=np.arange (1,12321,1,dtype=float)
print len(x1),len(y1)


# Building the parabolic basin (Bottom)
zf=np.arange(len(t59),dtype=float)
zf=   (0.088*((x1[None,:]**2)+(y1[:,None]**2)))-0.2
zf5=np.reshape(zf,(111,111))
zf1 = zf5[55,:]
zf2=zf1[5:106]
# End of building parabolic basin



h=np.zeros(len(x))
eq1=-((((B**2.0)*omega)/(4*g))*math.cos(2*omega*t))+C
term=(B*omega)/g
print 'eq1=',eq1,'term=',term

for i in range(len(x)):
   h[i] = eq1 - ((term*math.cos(omega*t)*x[i]))

maxfs=np.maximum([zf2],[h])
maxfs=maxfs[0]



# PLOTTING
plt.figure(1)
plt.plot(x,maxfs,'r',lw=1.5)
plt.plot(x1,zf1,'k',lw=1.5)
plt.legend(['Analytical','Bathymetry'], loc='upper center',fancybox=True,prop={'size':12})
plt.ylabel('Free Surface [m]',fontsize=12)
plt.xlabel('Distance [m]',fontsize=12)
plt.axis([-2.5,2.5,-0.2,0.25])
plt.title ('Initial conditions for planar surface',fontsize=15)
#plt.text(-0.43,0.30,RMSE,fontsize=12,bbox=props)#,bbox=dict(facecolor='none',edgecolor='black'))
plt.show()

可以根据建议使用for循环创建动画,并在创建时显示或保存每个绘图。您也可以使用。这将允许您以演示文稿中包含的格式保存动画。在动画模块中,您可以定义一个函数,在每次迭代中更新美工人员。在您的示例中,每次更新两行。这有点类似。本教程可能也会有所帮助

下面是一个例子,它使用了比您所包含的更简单的数学,但应该给您一个想法:

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.animation as animation


# Set up the figure
fig = plt.figure(1)
# Creat two lines to be updates in the animation. 
l1, = plt.plot([],[],'r',lw=1.5)
l2, = plt.plot([],[],'k',lw=1.5)
plt.legend(['Analytical','Bathymetry'], loc='upper center',fancybox=True,prop={'size':12})
plt.ylabel('Free Surface [m]',fontsize=12)
plt.xlabel('Distance [m]',fontsize=12)
plt.axis([-2.5,2.5,-0.2,0.25])
plt.title ('Initial conditions for planar surface',fontsize=15)

# Initialization function
def init():
    l1.set_data([], [])
    l2.set_data([], [])
    return l1,l2

# This function is called at each iteration of the animation.     
def update(t):
    x = np.arange(-3,3,0.1)
    x1 = np.arange(-3,3,0.1)

    maxfs = 0.1 * np.sin(x * t)
    zf1 = 0.1 * np.cos(x * t)

    # Update lines with new data. 
    l1.set_data(x,maxfs)
    l2.set_data(x1,zf1)
    return l1,l2

# Create animation
ani = animation.FuncAnimation(fig, update, frames = 10, blit=True, init_func = init)

plt.show()

对将参数帧更改为包含所需t值的iterable。类似于frames=np.arange(1,10,0.1)