Анимация зависящей от времени LineCollection с использованием matplotlib - PullRequest
0 голосов
/ 14 июля 2020

Как указано выше, я пытаюсь оживить набор данных, который изменяется во времени (позиции). Я хотел бы, чтобы мой график отображал только данные о местоположении, но анимировал историю позиций с течением времени. Я начал с этого примера здесь , и он заработал. Теперь, вместо анимации всей линии, я хотел бы, чтобы линия рисовалась слева направо. Мне также нужно, чтобы линия была окрашена относительно вторичного набора данных, который я смог выполнить sh с помощью LineCollection.

Мой код:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))

line = LineCollection([], cmap=plt.cm.jet)
line.set_array(np.linspace(0, 2, 1000))
ax.add_collection(line)

x = np.linspace(0, 2, 10000)
y = np.sin(2 * np.pi * (x))

# initialization function: plot the background of each frame
def init():
    line.set_segments([])
    return line,

# animation function.  This is called sequentially
def animate(i, xss, yss, line):
    xs = xss[:i]
    ys = yss[:i]
    points = np.array([xs, ys]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    line.set_segments(segments)
    return line,

# call the animator.  blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, fargs=[x, y, line], init_func=init, frames=200, interval=20)
plt.show()

Я создаю базовый c набор данных синусоидальной волны и снова хотел бы анимировать линию, рисуемую слева направо. Прямо сейчас LineCollection окрашивается по значению y линии в текущей позиции x. В конце концов, это будет набор данных о местоположении, извлеченный из файла .csv.

Наконец, проблема. Приведенный выше код работает без ошибок, однако линия не рисуется. В моем отладчике я вижу, что массивы xs и ys добавляются на каждом этапе, так что синтаксис кажется работающим , только обновленная LineCollection не отображается.

Я работаю на macOS Mojave 10.14.6.

1 Ответ

0 голосов
/ 14 июля 2020

Ваш код правильный, линия, которую вы рисуете, очень мала. Это связано с тем, что анимируемая функция задается

x = np.linspace(0, 2, 10000)  # Note that `num=10000`
y = np.sin(2 * np.pi * (x))

, имеющим 10000 точек, но вы анимируете только первые 200 точек.

anim = animation.FuncAnimation(..., frames=200, interval=20)

Простое исправление

num_frames = 200
x = np.linspace(0, 2, num_frames)
...
anim = animation.FuncAnimation(..., frames=num_frames, interval=20)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...