对于一个个人项目,我正在尝试为一个相当大的数据集(1000行)设置动画,以显示Jupyter笔记本中的多次潜水。最终,我还要添加加速度数据的子图。
我使用简单的示例作为粗略的模板,例如https://towardsdatascience.com/animations-with-matplotlib-d96375c5442c
中不断增长的线圈示例代码本身似乎运行缓慢但很好,但是它不输出动画,而只是输出静态图形:
这是我当前的代码:
x = np.array(dives.index)
y = np.array(dives['depth'])
x_data, y_data = [], []
fig = plt.figure()
ax = plt.axes(xlim=(0, 1000), ylim=(min(y),max(y)))
line, = ax.plot([], [])
def init():
line.set_data([], [])
return line,
def animate(i):
x_data.append(x[i])
y_data.append(y[i])
line.set_data(x, y)
return line,
plt.title('Bird Dives')
ani = animation.FuncAnimation(
fig, animate, init_func=init, frames= 1000, interval=50, blit=True)
ani.save('./plot-test.gif')
plt.show()
有没有理由只绘制图形而不是动画图形?
答案 0 :(得分:0)
是的,您的错误出在您的animate
函数中。您有line.set_data(x, y)
,它会在每一帧绘制x
和y
的全部内容(因此会生成不变的动画图。)
您打算在animate
函数中使用的是line.set_data(x_data, y_data)
。
关于性能:您可以通过不创建空列表并在每次迭代时都将其附加到列表中来改善此性能。相反,将原始数组x
和y
切片会更简单。请考虑使用以下animate
函数:
def animate(i):
line.set_data(x[:i], y[:i])
return line,
话虽如此,鉴于您有一千帧,它仍然需要一些时间才能运行。