使用matplotlib随时间推移的1D动画

时间:2014-08-27 11:36:42

标签: animation matplotlib

我之前从未尝试过在python中做过动画,所以提前道歉这个问题似乎很愚蠢。我在论坛上环顾四周,但很难找到像我一样随时间进行模拟的人有一个我能够理解的答案。

我有一个变量(maxfs),它是time(t)的函数。我计算了h并制作了一些1D图,我可以绘制不同的时间步长,因为maxfs随着时间的推移而演变,但只能通过手动改变t。但是,我在演示文稿中提供了一些数据,出于演示目的,我想展示解决方案随着时间的推移如何演变。我最初的想法是运行一个for循环的时间(t)在所有点计算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()

1 个答案:

答案 0 :(得分:2)

您可以根据建议使用for循环创建动画,并在创建时显示或保存每个绘图。您也可以使用Matplotlib animation module。这将允许您以可包含在演示文稿中的格式保存动画。动画模块允许您定义在每次迭代时更新艺术家的功能。在您的示例中,每次都会更新两行。这个basic example做了类似的事情。教程here也可能有所帮助。

这是一个使用比你所包含的更简单的数学的例子,但应该给你一个想法:

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()