Как комментарий @ s0upa1t, вы должны иметь фигуру в качестве первого аргумента для анимации. Критическая ошибка возникает из анимации, ожидающей объект fig
, который имеет атрибут canvas
, но вместо этого получает scatter
, объект PathCollection
, которого нет. В качестве примера минимальной анимации в форме вы хотите, рассмотрим,
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
dt = 0.005
n=20
L = 1
particles=np.zeros(n,dtype=[("position", float , 2),
("velocity", float ,2),
("force", float ,2),
("size", float , 1)])
particles["position"]=np.random.uniform(0,L,(n,2));
particles["velocity"]=np.zeros((n,2));
particles["size"]=0.5*np.ones(n);
fig = plt.figure(figsize=(7,7))
ax = plt.axes(xlim=(0,L),ylim=(0,L))
scatter=ax.scatter(particles["position"][:,0], particles["position"][:,1])
def update(frame_number):
particles["force"]=np.random.uniform(-2,2.,(n,2));
particles["velocity"] = particles["velocity"] + particles["force"]*dt
particles["position"] = particles["position"] + particles["velocity"]*dt
particles["position"] = particles["position"]%L
scatter.set_offsets(particles["position"])
return scatter,
anim = FuncAnimation(fig, update, interval=10)
plt.show()
Есть many хорошие анимации учебники, однако ответ here особенно приятно.
Возможный дубликат [почему это заговор с Matplotlib так медленно?] (Http://stackoverflow.com/questions/8955869/why-is-plotting-with-matplotlib-so-slow) – soupault
'FuncAnimation' принимает' fig 'как первый аргумент, а не' LineCollection'. Btw, поиск SO для статей по теме - их очень много. – soupault