Как анимировать граф данных в python, используя matplotlib.animation - PullRequest
1 голос
/ 01 апреля 2019

У меня есть два массива x и y, каждый из которых содержит более 365000 элементов.Я хотел бы нарисовать анимированную линию, используя эти элементы массива.Я использую matplotlib.animation для этого.Проблема в том, что когда я выполняю приведенный ниже код, я не могу видеть график плавно (анимированный).Наоборот, я вижу, что это окончательно нарисованная версия.

This is what I obtain

Вот мой код:

#libs
# Movement instance creation-----------------------------
movement1=Movement(train1, track1)
# # Move the train on the track

movement1.move()
y = movement1.speed
x = movement1.pos

Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)

fig = plt.figure()
ax = plt.axes(xlim=(0, 25), ylim=(0, 300))
line, = ax.plot([], [], lw=2)
# initialization function: plot the background of each frame
def init():
    line.set_data([], [])
    return line,

# animation function.  This is called sequentially
def animate(i):
    line.set_data(x, y)
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,
                                frames=200, interval=200, blit=True)


anim.save('basic_animation.mp4', writer=writer)

Вот результат, который я ожидаю:

Here is the similar result that I expect.

Конечно, мой график будет другой кривой.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Ваш код в основном в порядке; вам просто нужно сделать три вещи.

  1. Установите xdata и ydata строки на разные значения на каждой итерации anim_func (иначе анимация не будет, не так ли?)

  2. Установите постоянные пределы оси, чтобы ваш график не изменил форму

  3. Удалите вызов save для отображения (лично для меня это влияет на анимацию)

Итак:

ax.axis((x.min(), x.max(), y.min(), y.max())

def animate(i):
    line.set_data(x[:i], y[:i])
    return line,

0 голосов
/ 01 апреля 2019

Вам необходимо определить набор данных, который изменяется для анимации. На приведенном вами примере сайта автор делает это, разрезая данные с помощью overdose.iloc [: int (i + 1] (фактический используемый код см. Ниже). Это часть, которая создает анимацию в виде matplotlib, отображающего любые данные находится в функции animate. В вашем коде у вас есть вход line.set_data (x, y), который, как я полагаю, является вашим полным набором данных. Вот почему он не перемещается.

def animate(i):
    data = overdose.iloc[:int(i+1)] #select data range
    p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")
    p.tick_params(labelsize=17)
    plt.setp(p.lines,linewidth=7)

Второе, на что следует обратить внимание, это то, что ваш сюжет обрубается сверху. Это вероятно потому, что ваша инициализация уже неправильно устанавливает ось. Что бы я сделал, это добавил бы plt.axis ([0, 25, 0, 'верхний предел']), чтобы помочь правильно установить ось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...