【问题标题】:The saved animated plot keeps looping although Matplotlib FuncAnimation(...,repeat=False)尽管 Matplotlib FuncAnimation(...,repeat=False) 保存的动画情节继续循环
【发布时间】:2022-03-27 01:59:58
【问题描述】:

我想使用matplotlib 制作动画以进行PowerPoint 演示。动画应该只播放一次。

在我的代码中,FuncAnimation() 的参数 repeat 设置为 false。 因为我需要将图导入到PowerPoint中,所以我使用ani.save('test.gif')保存了它。 问题是当我打开保存的 test.gif 图形时,线图一直在循环。

Stackoverflow 上的所有搜索都建议使用repeat=False,或使用PillowWriter。这两种解决方案都不适合我,所以我有两个问题:

  1. 为什么保存的图会忽略repeat=False
  2. 我该如何解决这个问题?

提前感谢您帮助我。 请在下面找到我的代码:

import pandas as pd

import matplotlib.pyplot as plt

# import matplotlib.animation as animation
from matplotlib.animation import FuncAnimation, PillowWriter

df = pd.DataFrame(
    {
        "x": {
            0: 0,
            1: 1,
            2: 2,
            3: 3,
            4: 4,
            5: 5,
            6: 6,
            7: 7,
            8: 8,
            9: 9,
            10: 10,
            11: 11,
            12: 12,
            13: 13,
            14: 14,
            15: 15,
            16: 16,
            17: 17,
            18: 18,
            19: 19,
            20: 20,
            21: 21,
            22: 22,
            23: 23,
            24: 24,
            25: 25,
            26: 26,
            27: 27,
            28: 28,
            29: 29,
            30: 30,
            31: 31,
            32: 32,
            33: 33,
            34: 34,
            35: 35,
            36: 36,
            37: 37,
            38: 38,
            39: 39,
            40: 40,
            41: 41,
            42: 42,
            43: 43,
            44: 44,
            45: 45,
            46: 46,
            47: 47,
            48: 48,
            49: 49,
            50: 50,
        },
        "y": {
            0: 0.7695,
            1: 0.7983,
            2: 0.7958,
            3: 0.7975,
            4: 0.7983,
            5: 0.7966,
            6: 0.7971,
            7: 0.7962,
            8: 0.7962,
            9: 0.7975,
            10: 0.7983,
            11: 0.7987,
            12: 0.7996,
            13: 0.7992,
            14: 0.7967,
            15: 0.7983,
            16: 0.7971,
            17: 0.7987,
            18: 0.7979,
            19: 0.7983,
            20: 0.7983,
            21: 0.7921,
            22: 0.7975,
            23: 0.7962,
            24: 0.7975,
            25: 0.7979,
            26: 0.7983,
            27: 0.7992,
            28: 0.7983,
            29: 0.7983,
            30: 0.7987,
            31: 0.7983,
            32: 0.7983,
            33: 0.7983,
            34: 0.7992,
            35: 0.7975,
            36: 0.7996,
            37: 0.7992,
            38: 0.7979,
            39: 0.7987,
            40: 0.7983,
            41: 0.7983,
            42: 0.7987,
            43: 0.7987,
            44: 0.7992,
            45: 0.7992,
            46: 0.7979,
            47: 0.7996,
            48: 0.7992,
            49: 0.7987,
            50: 0.7992,
        },
    }
)


x = df["x"]
y = df["y"]
fig, ax = plt.subplots()
line, = ax.plot(x, y, color="b")

def update(num, x, y, line):
    line.set_data(x[:num], y[:num])
    return (line,)

ani = FuncAnimation(
    fig, update, len(x), fargs=[x, y, line], interval=15, blit=True, repeat=False
)

# ani.save('test.gif')
ani.save("test2.gif", dpi=80, writer=PillowWriter(fps=5))

plt.show()

【问题讨论】:

  • 我认为这是 powerpoint 的问题。我相信它会继续循环播放您放入其中的任何 GIF?
  • 问题是我还没有将 test.gif 文件导入到 powerpoint 中。只需双击,情节就会无穷无尽。
  • 我可能错了,但我认为 GIF 不会对它们是否应该循环进行编码,所以这不是 matplotlib 能够解决的问题。就像您的照片查看器正在选择是否循环播放一样。尝试将绘图保存为.mp4

标签: python matplotlib animation


【解决方案1】:

使用 ImageMagickWriter:

ani.save("test2.gif", dpi=80, writer=ImageMagickWriter(fps=5, extra_args=['-loop', '1']))

我花了很多时间研究这个。它有点像 '-loop 0' 被传递给电影编写器(转换)并且 extra_args 被附加但覆盖。这是我使用 extra_args=['-loop', '1'] 创建的 GIF:

注意:在新标签页中打开图像以查看它的播放。

即使覆盖 finish() method 中的硬编码 loop=0,我也从未让 PillowWriter 工作:

class PillowWriterNG(PillowWriter):
    def finish(self):
            self._frames[0].save(
                self.outfile, save_all=True, append_images=self._frames[1:],
                duration=int(1000 / self.fps), loop=1)

将循环参数从 0 更改为 1 会停止无限循环,但仍会运行两次!

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2012-09-16
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多