2016-07-16 115 views
1

我試圖保存一個GIF與2d使用pcolormesh(使用表面或線框也可以)一些波的演變。高效地動畫pcolormesh

這一直是我的形式給出了到目前爲止: 設置quadmesh極座標繪製:

from matplotlib import pyplot 
from matplotlib.animation import FuncAnimation as FuncAnimation 
pi=np.pi 


rmax=6. 
r=2*np.linspace(0,np.sqrt(rmax*.5),100)**2 
phi=np.linspace(0,2*pi,80) 

R, P = np.meshgrid(r, phi) 
X, Y = R*np.cos(P), R*np.sin(P) 

設定的數字和功能動畫: 數是我的幀的數量。 Z是具有我想繪製的值的count * 2D數組。 (它有一個像系列某些傅立葉的總和)

fig, ax = pyplot.subplots() 
def anim_I(count,r,phi): 
    anim=np.zeros((count,len(phi), len(r))) 
    for i in range(count): 
     anim[i,:,:]=coef_transf(final_coefs[i,:,:,:,0],r,phi)**2 
    return anim 

Z=anim_I(count,r,phi) 
def animate(i): 
    pyplot.title('Time: %s'%time[i]) 
    #This is where new data is inserted into the plot. 
    plot=ax.pcolormesh(X, Y,Z[i,:,:],cmap=pyplot.get_cmap('viridis'),vmin=0., vmax=15.) 
    return plot, 

ax.pcolormesh(X, Y,Z[0,:,:],cmap=pyplot.get_cmap('viridis'),vmin=0., vmax=15.) 
pyplot.colorbar() 

anim = FuncAnimation(fig, animate, frames = range(0,count,7), blit = False) 

我並不真的需要看直播,所以我只是保存GIF。

anim.save('%d_%d_%d-%d.%d.%d-2dgif.gif' %(localtime()[0:6]), writer='imagemagick')  
pyplot.close() 

雖然這可行,但可能需要一個小時才能製作出甚至上百幀的gif。

我不知道什麼是正確的方法來做到這一點,因此它可以使用。

我已經看到了這方面的其他文章,但我無法得到代碼工作,或者它會一樣無用。

回答

0

你可以試着寫的

def animate(i): 
pyplot.title('Time: %s'%time[i]) 
#This is where new data is inserted into the plot. 
plot=plot.set_array(Z[i,:,:].ravel()) 
return plot, 

代替

def animate(i): 
pyplot.title('Time: %s'%time[i]) 
#This is where new data is inserted into the plot. 
plot=ax.pcolormesh(X, Y,Z[i,:,:],cmap=pyplot.get_cmap('viridis'),vmin=0., vmax=15.) 
return plot, 

這不會創建一個新的對象每次調用的動畫funtion時間。相反,它會更改已創建的對象的圖像。 但是,set_array方法似乎需要一個扁平數組,因此.ravel()。

如果將pcolormap函數的着色選項設置爲shading ='gouraud',則只會生成正確的圖像。 我不知道爲什麼,不幸的是,它似乎與排序數組有關。

我希望這會有所幫助。