2016-11-12 120 views
2

我制作了一个matplotlib动画,其中箭头箭头在页面中移动。这不能以通常的方式实现(创建一个颤动对象并用动画的每一帧更新它),因为尽管有更新u,v组件的方法,但没有用于更改x ,y位置的箭头。因此,我正在为每个帧创建一个新的Quiver对象。保存matplotlib动画时未清除前面的帧

当我做一个plt.show()并且在屏幕上绘制动画时,这可以正常工作。箭头在页面上从左向右移动,当一个箭头出现时,前一个箭头消失,这正是我想要的。但是,当我保存为gif或mp4时,以前的箭头不会被清除,所以我最终会出现一整行箭头。我怎样才能解决这个问题?

我的代码如下:

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

n = 21 
x = np.linspace(-1.0, 1.0, num=n) 
def animate(i): 
    q = plt.quiver(x[i:i+1], [0], [1], [0]) 
    return q, 

plt.gca().set_xlim([-1, 1]) 
anim = matplotlib.animation.FuncAnimation(plt.gcf(), animate, frames=n, 
              repeat=True, blit=True) 

plt.show() 
#anim.save('anim.gif', dpi=80, writer='imagemagick') 
#anim.save('anim.mp4', dpi=80, writer='ffmpeg') 
+0

是否可以将您的设置用于透明图形修补程序?你可以通过'matplotlib.rcParams ['savefig.frameon']'检查,这应该是'True',以使每个新的补丁具有坚实的背景(http://matplotlib.org/api/pyplot_api.html)或设置参数使用'anim.save('anim.mp4',[..等等],extra_args = {'frameon':True})'(http://matplotlib.org/api/animation_api.html) – slushy

+0

检查此改变箭头的位置:http://stackoverflow.com/questions/17758942/is-it-possible-to-update-matplotlib-quiver-position-coordinates-in-an-animation –

+1

按建议使用q.set_offsets由@Jean完美的作品。谢谢! –

回答

1

溶液发现here,如由Jean-塞巴斯蒂安上面所建议的。我的代码现在显示为:

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

n = 21 
x = np.linspace(-1.0, 1.0, num=n) 
q = plt.quiver(x[:1], [0], [1], [0]) 
def animate(i): 
    q.set_offsets([[x[i], 0]]) 
    return q, 

plt.gca().set_xlim([-1, 1]) 
anim = matplotlib.animation.FuncAnimation(plt.gcf(), animate, frames=n, 
              repeat=True, blit=True) 

plt.show() 
#anim.save('anim.gif', dpi=80, writer='imagemagick') 
#anim.save('anim.mp4', dpi=80, writer='ffmpeg')