你有两个问题。一是因为你实际上把东西画了两次,二是纯粹是人类心理学(随着时间的推移,情节似乎会变慢,因为你在 10000 上加 1 点,而不是在 10 或 100 上加 1 点)。
我们先来讨论一下双抽:
The FuncAnimation
会为你绘制东西,但是通过告诉它使用位图传输,它只会更新轴的内部而不是刻度线等。因此,你需要手动调用draw
,但是动画会调用draw_artist
,还有。
通过删除,您应该能够获得至少 2 倍的加速blit=True
and plt.draw()
此外,通过设置interval=0
,你强迫它不断地绘制,这将有效地迫使事物锁定。将间隔设置为更合理的值,例如25
(间隔以毫秒为单位。“25”是 40 fps。)。
例如,这对我来说非常顺利:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
y = np.random.normal(0, 1, 10000).cumsum(axis=0)
x = np.arange(y.size)
fig, ax = plt.subplots()
line, = ax.plot([], [], '.')
ax.margins(0.05)
def init():
line.set_data(x[:2],y[:2])
return line,
def animate(i):
i = min(i, x.size)
xdata = x[:i]
ydata = y[:i]
line.set_data(xdata, ydata)
ax.relim()
ax.autoscale()
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init, interval=25)
plt.show()
我还添加了ax.margins(0.05)
以避免轴限制捕捉到下一个最接近的“偶数”数字并给出“不稳定”的外观。
但是,由于您逐渐绘制越来越多的数据,因此变化率将看起来很慢,仅仅是因为随时间变化的数据似乎较少。在 10000 的末尾加 1 点很难被注意到,但是在 10 的末尾加 1 点就很明显了。very显。
因此,剧情看起来much尽管更新速度相同,但开始时比结束时更“令人兴奋”。
这与 matplotlib 没有任何关系,而是您选择的数据动画方式的结果。
为了解决这个问题,您可以考虑在数据中移动“滑动窗口”并一次绘制恒定数量的点。举个例子:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
y = np.random.normal(0, 1, 1000000).cumsum(axis=0)
x = np.arange(y.size) + 1
fig, ax = plt.subplots()
line, = ax.plot([], [], 'k-')
ax.margins(0.05)
def init():
line.set_data(x[:2],y[:2])
return line,
def animate(i):
win = 300
imin = min(max(0, i - win), x.size - win)
xdata = x[imin:i]
ydata = y[imin:i]
line.set_data(xdata, ydata)
ax.relim()
ax.autoscale()
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init, interval=25)
plt.show()