有效地动画pcolormesh

时间:2016-07-16 01:25:32

标签: python animation matplotlib

我试图使用pcolormesh在2d中保存一些GIF的演变(使用曲面或线框也可以)。

到目前为止,这是我的方法: 将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)

设置动画的图形和功能: count是我拥有的帧数。 Z是一个计数* 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可能需要一个小时。

我不知道这样做的正确方法是什么,所以它可以使用。

我已经看到了这方面的另一篇文章,但是我无法使代码正常工作,或者它只是不合适。

2 个答案:

答案 0 :(得分: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,

每次调用animate功能时,都不会创建新对象。相反,它会更改已创建的对象的图像。 但是,set_array方法似乎需要一个扁平数组,因此需要.ravel()。

如果将pcolormap函数的着色选项设置为着色=' gouraud',则只生成正确的图像。 我不知道为什么,不幸的是,它似乎与数组的排序有关。

我希望,这有点帮助。

答案 1 :(得分:0)

我建议插入一个

e.target.value

pyplot.clf() 函数的开头。这将以空白图开始每一帧。否则,我怀疑该图将无法清除,并且很长的时间是由于实际上在新图之下绘制了所有先前的图。