Анимируйте точечную диаграмму с помощью PyPlot

Я пытаюсь построить движение частиц с помощью pyplot. Проблема в том, что я не могу понять, как создать анимацию.

Вот блокнот: http://nbviewer.ipython.org/gist/lhk/949c7bf7007445033fd9

По-видимому, функция обновления не работает должным образом, но сообщение об ошибке для меня слишком загадочно. Что мне нужно изменить?

У вас есть хороший учебник по анимации с помощью pyplot?


person lhk    schedule 28.08.2015    source источник
comment
возможный дубликат почему график с Matplotlib такой медленный?   -  person soupault    schedule 28.08.2015
comment
FuncAnimation принимает fig в качестве первого аргумента, а не LineCollection. Кстати, поищите на SO статьи по теме - их много.   -  person soupault    schedule 28.08.2015


Ответы (1)


Как комментирует @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() 

Существует множество хороших руководств по анимации, однако ответ здесь особенно приятно.

person Ed Smith    schedule 28.08.2015