如何配置FuncAnimation(从matplotlib.animation动态绘图)到numpy数组?

时间:2012-11-14 20:46:14

标签: python dynamic matplotlib pde

我对 MatPlotLib FuncAnimation 功能有一些问题。我无法将其配置为我的代码...我希望有人可以帮助我!!

这是一个扩散方程,我需要为每一步绘制它。在每一步,计算结果都是一个numpy数组。我设法用 pyplot.interactive(True)以动态的方式绘制它,但它非常迟钝。我读到 FuncAnimation 可以处理这个问题,但我没有设法让它在列表或数组中使用结果。

以下是经典慢情节的代码:
它产生一个矢量矢量( U ),它在所有计算之后被绘制

import numpy as np
import scipy
from scipy.linalg import solve_banded
from matplotlib import pyplot as plt
import matplotlib.animation as animation


def DrawRecord(U):
    plt.interactive(True)
    plt.figure(1)
    for i in range(0,len(U)):
        plt.clf()
        plt.plot(U[i])
        plt.ylim([0,1])
        plt.draw()

J=350.0 
dt=0.01 
T=3.0 
t=np.arange(dt,T,dt) 
dx=1.0/J 

D=0.005 
c=0.5 
r=0.1 

mu=c*dt/(2.0*dx) 
lambd=D*dt/(dx**2.0) 

K_x=50.0*np.ones(J-1) 
alpha_t=0.5*np.ones(len(t)) 

#initial conditions
u=np.zeros(J) 
u[J/5*1:J/5*2]=1 
U=u

espace=np.linspace(0,1,J) 

#Matrix
A=np.diag(-lambd*np.ones(J-2),1)+np.diag((1+2*lambd)*np.ones(J-1),0)+np.diag(-lambd*np.ones(J-2),-1)  
AA=scipy.linalg.inv(A)


for i in t:

    u[1:J]=scipy.dot(AA,u[1:J]+(r-alpha_t[i/dt])*dt*(u[1:J]-u[1:J]/K_x))
    u[0]=0 
    u[J-1]=0  

    U=np.vstack([U,u])

DrawRecord(U)

这是我尝试用前面的代码(大失败)转动 FuncAnimation nb: U内容为每个步骤计算的结果数组

global U

fig = plt.figure()
window = fig.add_subplot(111)
line, = window.plot(list(U[1,:]))

def init():
    line=list(U[1,:])
    return line

def animate(i):
    line.set_ydata(list(U[i,:]))
    return line

anim = animation.FuncAnimation(fig, animate, init_func=init,
                           frames=200, interval=20, blit=True)

plt.show()

这会产生很多错误......也许有人可以为之前的代码设置它! 我希望我很清楚(对不起我的英语)并感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

FuncAnimation期望一个iterable从init返回并更新

试试这个:

def init():
    line.set_ydata(U[1,:])
    return line,

答案 1 :(得分:1)

你的init函数不对,应该是:

def init():
    line.set_ydata(U[1,:])
    return line

您也不需要将numpy切片转换为列表。

答案 2 :(得分:1)

我遇到了类似的错误,我通过添加逗号修复了它。

def init():
    line.set_ydata(U[1,:])
    return line,

由于某种原因,这修复了它。如果您要返回多个对象,则不需要尾随逗号。如果你问我,那就是血腥的神秘错误信息。