我正在尝试使用Matplotlib的FuncAnimation
动画显示每帧动画一个点的显示。
# modules
#------------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as py
from matplotlib import animation
py.close('all') # close all previous plots
# create a random line to plot
#------------------------------------------------------------------------------
x = np.random.rand(40)
y = np.random.rand(40)
py.figure(1)
py.scatter(x, y, s=60)
py.axis([0, 1, 0, 1])
py.show()
# animation of a scatter plot using x, y from above
#------------------------------------------------------------------------------
fig = py.figure(2)
ax = py.axes(xlim=(0, 1), ylim=(0, 1))
scat = ax.scatter([], [], s=60)
def init():
scat.set_offsets([])
return scat,
def animate(i):
scat.set_offsets([x[:i], y[:i]])
return scat,
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(x)+1,
interval=200, blit=False, repeat=False)
不幸的是,最终的动画情节与原始情节不同。在每帧动画期间,动画情节也会闪烁几个点。有关如何使用animation
包正确设置散点图动画的建议吗?
答案 0 :(得分:9)
您的示例的唯一问题是如何填充animate
函数中的新坐标。 set_offsets
期望Nx2
ndarray,并提供两个1d数组的元组。
所以只需使用它:
def animate(i):
data = np.hstack((x[:i,np.newaxis], y[:i, np.newaxis]))
scat.set_offsets(data)
return scat,
要保存您可能想要调用的动画:
anim.save('animation.mp4')
答案 1 :(得分:1)
免责声明,我编写了一个库来尝试简化此过程,但是使用了ArtistAnimation
,称为celluloid。您基本上可以正常地编写可视化代码,并在绘制完每一帧后拍照。这是一个完整的示例:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
from celluloid import Camera
fig = plt.figure()
camera = Camera(fig)
dots = 40
X, Y = np.random.rand(2, dots)
plt.xlim(X.min(), X.max())
plt.ylim(Y.min(), Y.max())
for x, y in zip(X, Y):
plt.scatter(x, y)
camera.snap()
anim = camera.animate(blit=True)
anim.save('dots.gif', writer='imagemagick')