同一图中的连续matplotlib动画

时间:2017-10-27 19:29:50

标签: python animation matplotlib

我有一个算法,它由两个不同的部分组成,我想要一个接一个地可视化(同时可能在动画2开始时将动画1的最终状态保持在屏幕上)。

我可以通过调用animation.FuncAnimationplt.show()来单独显示这两个部分。由于这两个部分都设置了帧数和它们自己的行为,我想将它们的实现分成两个不同的类,然后围绕它们做一个包装器,它们按顺序播放它们。

但是,是否可以在同一图中一个接一个地显示两个(或更多)动画对象?

非常感谢, 马特

1 个答案:

答案 0 :(得分:1)

感谢ImportanceOfBeingErnest的提示,我提出了一个解决方案,它根据当前时间步骤仅更新动画师状态的某些元素。这是一个说明这种方法的小例子:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from math import sin, radians


class AnimationHandler:
    def __init__(self, ax):

        self.ax = ax

        self.lines   = [self.ax.plot([], []), self.ax.plot([], [])]
        self.colors  = ['cyan', 'red']
        self.n_steps = [360, 360]
        self.step = 0

    def init_animation(self):
        for anim_idx in [0, 1]:
            self.lines[anim_idx], = self.ax.plot([0, 10], [0, 0], c=self.colors[anim_idx], linewidth=2)
        self.ax.set_ylim([-2, 2])
        self.ax.axis('off')

        return tuple(self.lines)

    def update_slope(self, step, anim_idx):
        self.lines[anim_idx].set_data([0, 10], [0, sin(radians(step))])

    def animate(self, step):
        # animation 1
        if 0 < step < self.n_steps[0]:
            self.update_slope(step, anim_idx=0)

        # animation 2
        if self.n_steps[0] < step < sum(self.n_steps):
            self.update_slope(step - self.n_steps[0], anim_idx=1)

        return tuple(self.lines)


if __name__ == '__main__':
    fig, axes = plt.subplots()
    animator = AnimationHandler(ax=axes)
    my_animation = animation.FuncAnimation(fig,
                                           animator.animate,
                                           frames=sum(animator.n_steps),
                                           interval=10,
                                           blit=True,
                                           init_func=animator.init_animation,
                                           repeat=False)

    Writer = animation.writers['ffmpeg']
    writer = Writer(fps=24, metadata=dict(artist='Me'), bitrate=1800)
    my_animation.save('./anim_test.mp4', writer=writer)

    plt.show()

enter image description here

我使用这种方法来可视化/调试具有不同运行时的不同元素的算法。方法是相同的:您知道每个子序列的步数,并相应地调整状态。

enter image description here