Как создать вороной анимацию для перемещения точек в matplotlib? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь создать анимационный фильм из данных отслеживания для набора баллов - 5 баллов.

Формат набора данных

Координаты x, y для 5 точек находятся в кадре данных Pandas с общим числом столбцов 10 - каждая парастолбцы - это координаты x, y для точки в любой момент времени .В каждой строке указывается положение точки после 1/10 секунды. Пример будет выглядеть следующим образом -

   x1  y1  x2  y2  x3  y3  x4  y4  x5  y5
0   1   3   2   1   9   1   1   1   8   1
1   5   7   5   5   7   5   5   8   4   5
2   7   1   7   9   7   5   4   8   0   7
3   3   5   4   6   3   6   9   7   3   0

Функция построения графика

Функция, которую я использовал для создания анимации из точек, такова:


import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()

df = pd.read_csv(file)


def _update_plot(i, fig, scat):
    scat.set_offsets(([dff.iloc[i,0], dff.iloc[i,1]], [dff.iloc[i,2],dff.iloc[i,3]], [dff.iloc[i,4],dff.iloc[i,5]], [dff.iloc[i,6],dff.iloc[i,7]], [dff.iloc[i,8],dff.iloc[i,9]]))


    return scat,

anim = animation.FuncAnimation(fig, _update_plot, fargs = (fig, scat),
                               frames = len(dff.index)-1, interval = 100)

Это работает для меня без каких-либо проблем.Однако сейчас я хочу создать анимацию Вороного из точек.Я думал, что это будет так же просто, как просто добавить это в функцию построения графика после импорта из scipy.spatial:

vor = Voronoi(points) ##points are the rows of the `df`
voronoi_plot_2d(vor)

Однако это не сработало.Там не было никаких ошибок, но ничего не изменилось.Я уверен, что создание анимации немного сложнее, чем я пытался.

Конечный результат, который я имею в виду, будет очень похож на это видео (конечно, больше очков).Как я могу создать анимацию, используя matplotlib?Любая помощь будет оценена.

1 Ответ

0 голосов
/ 30 июня 2019

Я думаю, это похоже на то, что вы ищете.Дайте мне знать, если я на правильных линиях.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from io import StringIO
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d

df = pd.read_csv(StringIO("""
   x1  y1  x2  y2  x3  y3  x4  y4  x5  y5
0   1   3   2   1   9   1   1   1   8   1
1   5   7   5   5   7   5   5   8   4   5
2   7   1   7   9   7   5   4   8   0   7
3   3   5   4   6   3   6   9   7   3   0"""),
sep='\s+')

fig, ax = plt.subplots(1, 1)

ax.set_xlim(df.iloc[:, ::2].values.min(),
            df.iloc[:, ::2].values.max())
ax.set_ylim(df.iloc[:, 1::2].values.min(),
            df.iloc[:, 1::2].values.max())

def updater(i):
    ax.cla()
    ax.scatter(df.iloc[i, ::2], df.iloc[i, 1::2])
    vor = Voronoi(np.vstack((df.iloc[i, ::2], df.iloc[i, 1::2])).T)
    voronoi_plot_2d(vor, ax=ax)

anim = animation.FuncAnimation(fig, updater, 
                               frames=df.shape[0], interval=1000)
...