如何将动画保存为gif并同时显示?

时间:2016-02-29 08:37:40

标签: python animation matplotlib imagemagick

我编写了一个生成并显示matplotlib动画的代码。我也可以将动画保存为gif。

然而,当我按顺序执行这两个操作时(首先保存gif,然后显示动画,因为plt.show()是一个阻塞调用,所显示的动画不会从头开始;它似乎&& #39;首先由gif保存程序使用。

我的想法是使用plt.show()在窗口中显示动画,并将与gif相同的动画保存到磁盘(在动画期间,之前或理想情况下)。我试图使用Threads或创建新图来解决这个问题,但是我无法将其拉下来 - 所显示的动画总是被保存例程修改。另外,将plt.show放入线程中并不起作用(因为它处理绘图到屏幕,我想,所以它需要在主线程中)。

以下是我使用的代码:

import matplotlib.pyplot as plt
from matplotlib import animation
from visualizer import visualize
import updater


def run(k, update_func=updater.uniform,
        steps=1000, vis_steps=50,
        alpha_init=0.3, alpha_const=100, alpha_speed=0.95,
        diameter_init=3, diameter_const=1, diameter_speed=1,
        xlim=(-1, 1), ylim=(-1, 1),
        points_style='ro', lines_style='b-',
        save_as_gif=False):

    fig = plt.figure()
    ax = fig.add_subplot(111, xlim=xlim, ylim=ylim)

    global curr_alpha, curr_diameter, points, lines

    points, = ax.plot([], [], points_style)
    lines, = ax.plot([], [], lines_style)

    curr_alpha = alpha_init
    curr_diameter = diameter_init

    def update_attributes(i):
        global curr_alpha, curr_diameter

        if i % alpha_const == 0:
            curr_alpha *= alpha_speed
        if i % diameter_const == 0:
            curr_diameter *= diameter_speed

    def init():
        lines.set_data([], [])
        points.set_data([], [])

    def loop(i):
        for j in range(vis_steps):
            update_func(k, curr_alpha=curr_alpha, curr_diameter=curr_diameter)
            update_attributes(i * vis_steps + j)
        visualize(k, points, lines)
        return points, lines

    anim = animation.FuncAnimation(fig, loop, init_func=init, frames=steps // vis_steps, interval=1, repeat=False)

    if save_as_gif:
        anim.save('gifs/%s.gif' % save_as_gif, writer='imagemagick')

    plt.show()

0 个答案:

没有答案