【问题标题】:Consecutive matplotlib animation in same figure同一图中的连续 matplotlib 动画
【发布时间】:2017-10-27 19:29:49
【问题描述】:

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

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

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

非常感谢, 马特

【问题讨论】:

  • 是的,这是可能的。既然你知道第一个动画的帧数,我可以想象使用计时器来启动第二个动画可以很好地工作。也可以使用一个简单的包装类。如果您想提供问题的minimal reproducible example,可以轻松提供答案。

标签: python animation matplotlib


【解决方案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()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多