我有两个数组x和y,每个数组都有超过365000个元素。我想使用这些数组元素绘制一条动画线。我正在使用matplotlib.animation。问题是当我执行下面的代码时,我看不到平滑(动画)绘制的图形。相反,我看到它是最终的绘制版本。
这是我的代码:
#libs
# Movement instance creation-----------------------------
movement1=Movement(train1, track1)
# # Move the train on the track
movement1.move()
y = movement1.speed
x = movement1.pos
Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)
fig = plt.figure()
ax = plt.axes(xlim=(0, 25), ylim=(0, 300))
line, = ax.plot([], [], lw=2)
# initialization function: plot the background of each frame
def init():
line.set_data([], [])
return line,
# animation function. This is called sequentially
def animate(i):
line.set_data(x, y)
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=200, blit=True)
anim.save('basic_animation.mp4', writer=writer)
这是我期望的类似结果:
我的图当然是另一条曲线。
答案 0 :(得分:0)
您需要定义一组数据,这些数据会随着动画的发生而发生变化。在您给出的示例站点中,作者通过使用overdose.iloc [:int(i + 1](请参见下面的实际代码)对数据进行切片来做到这一点。这是在matplotlib绘制任何数据时创建动画的部分在动画函数中。在您的代码中,您输入的是line.set_data(x,y),我想是您的整个数据集。这就是为什么它不动的原因。
def animate(i):
data = overdose.iloc[:int(i+1)] #select data range
p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")
p.tick_params(labelsize=17)
plt.setp(p.lines,linewidth=7)
要注意的第二件事是您的剧情在顶部被砍掉。这可能是因为您的初始化已经错误地设置了轴。我要做的是添加一个plt.axis([0,25,0,'upper limit'])来帮助正确设置轴。
答案 1 :(得分:0)
您的代码基本上没问题;您只需要做三件事。
每次xdata
的迭代时,将行的ydata
和anim_func
设置为不同的值(否则,将没有动画,会吗?)
设置恒定的轴限制,以使绘图不改变形状
删除save
调用以用于显示(对我个人而言,我发现它会影响动画)
所以:
ax.axis((x.min(), x.max(), y.min(), y.max())
def animate(i):
line.set_data(x[:i], y[:i])
return line,