2012-11-14 58 views
3

我有一些問題FuncAnimation功能MatPlotLib。我無法將其配置爲我的代碼...我希望有人能幫助我!如何配置FuncAnimation(從matplotlib.animation動態繪圖)到numpy數組?

這是一個擴散方程,我需要爲它的每一步繪製它。在每一步中,計算的結果都是一個numpy數組。我設法用pyplot.interactive(True)以動態方式繪製它,但它非常滯後。我讀了FuncAnimation可以處理這個問題,但我沒有設法讓它在列表或數組中處理結果。

這裏是一個經典慢陰謀代碼:
它產生向量(ü)至極都計算

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) 

這裏後ploted的載體是我做轉的嘗試FuncAnimation與前一代碼(大失敗):
NB:對於每個計算出的結果的ü內容陣列步驟

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

這會產生很多錯誤...也許有人可以爲之前的代碼進行設置!
我希望我很清楚(對不起我的英文),並感謝您的幫助。

+0

你能告訴我們你收到了什麼錯誤嗎? – tacaswell

回答

1

你的初始化函數是不對的,應該是:

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

你也不需要將numpy的切片轉換到一個列表。

+0

事實上,這似乎更好,但我仍然有它崩潰: 類型錯誤: '的Line2D' 對象不是可迭代 全球ü 圖= plt.figure() 窗口= fig.add_subplot(111) 線=窗口.plot(U [1,:)) DEF的init(): line.set_ydata(U [1 ,:]) 返回管線 DEF動畫(ⅰ): \t line.set_ydata(U [I ,:]) \t return line anim =動畫。FuncAnimation(fig,animate,init_func = init, frames = 200,interval = 20,blit = True) plt.show() 任何想法? –

+0

清晰版: \t 事實上,這似乎更好,但我仍然有它崩潰:*類型錯誤:「的Line2D」對象不是可迭代* 任何想法?謝謝 –

+0

@kadok你使用的是什麼版本的matplotlib?你能弄清楚你的代碼中錯誤來自哪裏(我懷疑是第4行)?一個簡單的解鎖策略是添加'print'語句並查看在異常之前打印哪些語句。該錯誤告訴你,你正在試圖遍歷一個'Line2D'對象(這不是一個可迭代對象,因此引發了一個類型錯誤)。 – tacaswell

2

FuncAnimation預計可迭代到由init返回並更新

試試這個:

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

我遇到了類似的錯誤,我加一個逗號固定它。

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

由於某種原因,這固定它。如果您要返回多個對象,則不需要尾隨逗號。血腥隱晦的錯誤信息,如果你問我。