Python - анимация большого набора данных с помощью matplotlib - PullRequest
1 голос
/ 17 марта 2020

Для личного проекта я пытаюсь анимировать довольно большой набор данных (1000 строк), чтобы показать несколько погружений птиц в блокноте Jupyter. В конце концов, я также хотел бы добавить к нему вспомогательные участки данных ускорения.

Я использовал простые примеры в качестве грубого шаблона, такие как пример растущей катушки в: https://towardsdatascience.com/animations-with-matplotlib-d96375c5442c

Кажется, что сам код работает медленно, но нормально, но он не выводит анимацию, только график c: enter image description here

Вот мой текущий код :

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()

Есть ли причина, по которой он просто строит график, а не анимированный?

1 Ответ

0 голосов
/ 17 марта 2020

Да, ваша ошибка в вашей функции 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,

Сказав это, учитывая, что у вас есть тысяча кадров, запуск по-прежнему займет некоторое время.

...