如何在matplotlib中为移动点创建voronoi动画?

时间:2019-06-30 11:05:22

标签: python matplotlib animation voronoi

我正在尝试根据跟踪数据(一组5点)来制作动画电影。

数据集格式

这5个点的x,y坐标位于一个总共10列的Pandas数据框中-每对列都是任意给定时间点的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)

对我来说没有任何问题。但是,我现在想根据要点创建一个Voronoi动画。我认为这就像从scipy.spatial导入后将其添加到绘图功能一样简单:

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

但是,那没有解决。没有任何错误,但没有任何变化。我被认为创建动画比我尝试的要复杂得多。

我想到的最终输出将与this video非常相似(当然,还有更多点)。 如何使用matplotlib创建动画?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为这看起来让人想起您想要的东西。让我知道我是否正确。

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)