【问题标题】:How to create a voronoi animation for moving points in matplotlib?如何为 matplotlib 中的移动点创建 voronoi 动画?
【发布时间】:2019-06-30 11:05:22
【问题描述】:

我正在尝试根据一组点的跟踪数据创建动画电影 - 5 个点。

数据集格式

5 个点的 x,y 坐标位于 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)

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

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

然而,这并没有成功。没有任何错误,但没有任何改变。我被引导相信创建动画比我尝试的要复杂一些。

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

【问题讨论】:

    标签: python matplotlib animation voronoi


    【解决方案1】:

    我认为这看起来让人想起您正在寻找的东西。让我知道我是否在正确的路线上。

    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)
    

    【讨论】:

    • 我在 google colab 中运行您的代码,但没有任何动作。估计要动了?真的能做成动画吗?
    • Here 是 colab 中的动画示例。由于 colab 无法显示交互式图形(您看到的是静态 png 图像),因此您基本上需要先创建一些 javascript 对象。
    • 感谢您的回答。这对我有用。我有几个问题。首先,我希望不同的点具有不同的大小和颜色。在我的动画中,我传递了一个像这样的大小和颜色数组 - scat.set_color(np.array(["red", "green", "blue", "yellow", "k"]))。但是,现在这并没有达到预期的效果,那么发生了什么?其次,我还尝试添加一些行,例如 - ax.plot([1,2],[4,5]) 并且这些行也不起作用。另外,我在函数开头添加了plt.cla(),以清除上一次迭代中的Voronoi。
    • 另外,感谢您向我展示了一种更 Pythonic 的方式来获取要绘制的点列表。
    • 我认为是 ax.cla() 在调用函数后删除了绘制的其他线、点等(尽管为什么,我不明白,因为我在绘制它们之后该函数被调用)。这仍然给我留下了无法在函数内为散点图设置大小、颜色属性的问题。
    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2015-11-02
    • 2016-06-01
    • 2021-04-02
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多