如何使用matplotlib.animation获取程序输出的视频?

时间:2013-09-06 12:36:34

标签: python animation matplotlib cluster-analysis

我编写了一个python脚本,它使用启发式方法在空间中聚类2D点。我用不同的集群代表每个集群。

目前, 我的程序结构是:

def cluster():
   while True:
       <do_some_work>
       if <certain_condition_is_met>:
            print "ADDED a new cluster:",cluster_details
       if <breaking_condition_is_met>:
            break
   return Res

def plot_cluster(result):
    <chooses a unique color for each cluster, and calls 
    pyplot.plot(x_coods,y_coods)
    for each cluster>

def driver_function():
   result = cluster()
   plot_cluster(result)
   pyplot.show()

也就是说,目前,我只是获得了聚类点的最终图像,其中每个聚类用不同的颜色表示。

但是,我需要创建一个程序如何进行的动画,例如: “最初,所有点都应该是相同的颜色,比如说蓝色。然后,就像cluster()函数一样,不是简单地打印”添加新的聚类“,而是应该在图像中更改新聚类中这些点的颜色。已出现在屏幕上。

有什么方法可以使用matplotlib生成这样一个程序的视频? 我看到了一个

的例子
`matplotlib.animation.FuncAnimation( ..., animate, ...)`

但是它反复调用应该返回plottable值的animate函数,我认为我的程序不能。

有没有办法获得这个程序如何进行的视频?

2 个答案:

答案 0 :(得分:1)

要让这个按照您想要的方式工作需要一些重构,但我认为这样的事情会起作用:

class cluster_run(object):
    def __init__(self, ...):
        # what ever set up you want
        self.Res = None

    def reset(self):
        # clears all work and starts from scratch
        pass

    def run(self):
        self.reset()
        while True:
            #<do_some_work>
            if <certain_condition_is_met>:
                print "ADDED a new cluster:",cluster_details
                yield data_to_plot
            if <breaking_condition_is_met>:
                break

            self.Res = Res


class culster_plotter(object):
    def __init__(self):
        self.fig, self.ax = plt.subplots(1, 1)

    def plot_cluster(self, data_to_plot):
        # does what ever plotting you want.
        # fold in and
        x_coords, y_coords)
        ln = self.ax.plot(x_coords, y_coords)
        return ln

cp = cluster_plotter()
cr = cluster_run()

writer = animation.writers['ffmpeg'](fps=30, bitrate=16000, codec='libx264')
ani = animation.FuncAnimation(cp.fig, cp.plot_cluster, cr.run())
ani.save('out.mp4', writer=writer)
plot_cluster(cr.Res)

答案 1 :(得分:0)

使用pyplot.savefig('[frame].png')是否足够,其中[frame]是您的绘图的帧编号,然后使用编解码器(如ffmpeg)将这些图像拼接在一起?