【问题标题】:matplotlib animation durationmatplotlib 动画持续时间
【发布时间】:2014-03-27 11:06:36
【问题描述】:

下面的代码连续显示并保存了一个随机矩阵的动画。我的问题是如何调整我保存的动画的持续时间。我在这里拥有的唯一参数 fps 和 dpi 首先控制一帧剩余的秒数,第二个控制图像的质量。 我想要的是根据实际存储的矩阵数量来实际控制要保存的帧数

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

N = 5

A = np.random.rand(N,N)
im = plt.imshow(A)

def updatefig(*args):
    im.set_array(np.random.rand(N,N))
    return im,

ani = animation.FuncAnimation(fig, updatefig, interval=200, blit=True) 

ani.save('try_animation.mp4', fps=10, dpi=80) #Frame per second controls speed, dpi       controls the quality 
plt.show()

我想知道是否应该添加更多参数。我试图在 matplotlib 的类文档中寻找合适的文档,但没有成功:

http://matplotlib.org/api/animation_api.html#module-matplotlib.animation

【问题讨论】:

    标签: python animation matplotlib


    【解决方案1】:

    多年后,我建立了这个示例,每次我需要查看动画参数之间的关系时,我都会返回该示例。我决定在这里分享给任何觉得有用的人。

    tl/博士:

    • 对于保存的动画,持续时间将为frames * (1 / fps)(以秒为单位)
    • 对于显示动画,持续时间将为frames * interval / 1000(以秒为单位)

    下面的代码可让您在提供即时视觉反馈的环境中使用此设置。

    这段代码根据参数构建了一个时钟:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    
    fig = plt.figure(figsize=(16, 12))
    ax = fig.add_subplot(111)
    # You can initialize this with whatever
    im = ax.imshow(np.random.rand(6, 10), cmap='bone_r', interpolation='nearest')
    
    
    def animate(i):
        aux = np.zeros(60)
        aux[i] = 1
        image_clock = np.reshape(aux, (6, 10))
        im.set_array(image_clock)
    
    ani = animation.FuncAnimation(fig, animate, frames=60, interval=1000)
    ani.save('clock.mp4', fps=1.0, dpi=200)
    plt.show()
    

    这将生成并保存如下所示的动画:

    所以关键是随着时间的推移黑色方块会沿着白色大方块移动。有 60 个白盒子,因此您可以构建一个在一分钟内完成的时钟。

    现在,需要注意的重要一点是有两个参数决定了黑盒的移动速度:animation.FuncAnimation 函数中的interval 和@987654328 中的'fps' @ 功能。第一个控制您将显示的动画中的速度,第二个控制您将保存的动画中的速度。

    按照上面的代码,您将生成 60 帧,它们以每秒 1 帧的速度显示。这意味着时钟每秒都在滴答作响。如果您希望保存的动画时钟每两秒滴答一次,那么您应该设置fps=0.5。如果您希望显示的动画时钟每两秒点击一次,您应该设置interval=2000

    [我会尽快编辑较长的解释]

    【讨论】:

    • 所以如果我有 2 个列表,比如 x 和 y,对应于钟摆在时间上的坐标,比如从 0 秒到 10 秒,我希望显示的动画的持续时间为 10秒(模拟实时),我应该如何设置参数呢?我一直在尝试,但我无法让它按我的意愿工作..
    【解决方案2】:

    The documentation 表明FuncAnimation 接受参数frames,该参数控制播放的总帧数。因此,您的代码可以读取

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    fig = plt.figure()
    
    N = 5
    
    A = np.random.rand(N,N)
    im = plt.imshow(A)
    
    def updatefig(*args):
        im.set_array(np.random.rand(N,N))
        return im,
    
    ani = animation.FuncAnimation(fig, updatefig, frames=10, interval=200, blit=True) 
    
    ani.save('try_animation.mp4', fps=10, dpi=80) #Frame per second controls speed, dpi       controls the quality 
    plt.show()
    

    播放 10 帧。

    【讨论】:

    • 确实文档说:帧可以是一个生成器,一个可迭代的,或多个帧。
    • 确实文档说:帧可以是一个生成器,一个可迭代的,或多个帧。所以我的错误,我读了开头并且不够仔细。另一方面,您的解决方案确实提供了正确的结果-它保存的文件具有等于帧/ fps 的适当持续时间。但是,显示的文件(不是保存的文件)不遵循这种模式,它只是继续以非周期性方式显示新帧。知道这是为什么吗?
    • “以非周期性方式”是什么意思?
    • 如果我有十帧,我期望显示的动画每十帧重复一次 - 或者至少停止。非周期性是指帧与 10 帧(11)的周期不同!= 帧(1)
    • 如果没有设置框架怎么办?只是为了让动画循环回来。有没有办法限制animation.save() 调用本身的持续时间?
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2012-12-12
    相关资源
    最近更新 更多