Matplotlib使用多行动画子图

时间:2019-02-24 04:54:21

标签: python matplotlib

我正在尝试将几种数值方案与PDE的精确解进行比较。为此,我尝试制作一个动画,其中有多个子图,每个子图都有两个正在演变的功能。 (精确的数字)

我发现了如何在此处制作多行动画, Matplotlib multiple animate multiple lines

我还发现了如何制作多个子图。 animated subplots using matplotlib

但是我不确定怎么做。当一起看时,它们看起来是如此混乱(我对matplotlib不太熟悉,尤其是FuncAnimation) 而且我还想将子图编号作为变量,以便用户可以输入任意数量的函数。

我的代码是这个。当前,此代码为每种数值方案生成图,但是我希望它仅绘制一个图。 因此,“绘图”功能只能调用一次,

plot(*arguments, FTCS, upwind, anotherfunc, anotherfunc2, ...)

这样。

抱歉,代码混乱。我附上所有这些只是为了 一个最小的工作示例。只有“绘图”功能与我的问题有关。

*修改后的代码。

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



#dt=1/5
dx=1/400
tm=9
xm=1
C=0.8
u=.1
dt=dx*C/u
arguments=dt,dx,tm,xm,C

def plot(dt,dx,tm,xm,C,*funcs):
    plt.figure()
    fig,axes=plt.subplots(len(funcs))
    i=1
    for ax,func in zip(axes, funcs):
    #    plt.subplot(len(funcs),1,i)
        x1,T1=func(dt,dx,tm,xm,C)
        plotlays, plotcols = [2], ["black","red"]
        lines = []
        ax=plt.axes(xlim=(0,1),ylim=(-1.1,1.1))
        line,=ax.plot([],[],lw=2)
        for index in range(2):
            lobj = ax.plot([],[],lw=2,color=plotcols[index])[0]
            lines.append(lobj)

        def init():
            for line in lines:
                line.set_data([],[])
            return lines

        def animate(i):
            x=x1
            y=T1[i]
            y2=T2[i]
            xlist=[x,x]
            ylist=[y,y2]

            for lnum,line in enumerate(lines):
                line.set_data(xlist[lnum],ylist[lnum])
            return lines

        anim=animation.FuncAnimation(fig,animate,init_func=init,frames=np.shape(T1)[0],interval=20,blit=False)

        plt.title('%s' % func.__name__)
        plt.xlabel('x')
        plt.ylabel('T')
        i+=1

    plt.show()



    return



def finit(x):
    if 0<=x<=.1:
        return np.sin(10*np.pi*x)
    else:
        return 0

def FTCS(dt,dx,tm,xm,C):
    x=np.arange(0,xm+dx,dx)
    t=np.arange(0,tm+dt,dt)
    lx=len(x)
    lt=len(t)
    T=np.zeros([lt,lx])
    for i in range(0,lx):
        T[0,i]=finit(x[i])
    for n in range(0,lt-1):
        for j in range(1,lx-1):
            T[n+1,j]=T[n,j]-.5*C*(T[n,j+1]-T[n,j-1])
    return x,T

def upwind(dt,dx,tm,xm,C):
    x=np.arange(0,xm+dx,dx)
    t=np.arange(0,tm+dt,dt)
    lx=len(x)
    lt=len(t)
    T=np.zeros([lt,lx])
    for i in range(0,lx):
        T[0,i]=finit(x[i])
    for n in range(0,lt-1):
        for j in range(1,lx-1):
            T[n+1,j]=(1-C)*T[n,j]+C*T[n,j-1]
    return x,T

def exact(dt,dx,tm,xm,C):
    x=np.arange(0,xm+dx,dx)
    t=np.arange(0,tm+dt,dt)
    u=C*dx/dt
    T=np.zeros([len(t),len(x)])
    for n in range(0,len(t)):
        for j in range(0,len(x)):
            if u*t[n]<x[j]<=u*t[n]+.1:
                T[n,j]=np.sin(10*np.pi*(x[j]-u*t[n]))
            else: T[n,j]=0
    return T

plot(*arguments,FTCS,upwind)

0 个答案:

没有答案