【问题标题】:Matplotlib get all axes artist objects for ArtistAnimation?Matplotlib 获取 ArtistAnimation 的所有轴艺术家对象?
【发布时间】:2019-02-16 19:58:38
【问题描述】:

我正在尝试像这样使用 ArtistAnimation 制作动画:

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

fig, ax = plt.subplots()

ims = []
for i in range(60):
    x = np.linspace(0,i,1000)
    y = np.sin(x)
    im = ax.plot(x,y, color='black')
    ims.append(im)

ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
                                repeat_delay=1000)

plt.show()

这会在图形上生成正弦波的动画。目前我只是将ax.plot() 返回的 Lines2D 对象添加到ims。但是,我想可能在轴上绘制多个重叠图,并调整每个帧的标题、图例和 x 轴范围。在为每一帧绘制并进行所有我想要的更改之后,如何获得一个可以添加到 ims 的对象?

【问题讨论】:

    标签: python-3.x matplotlib animation


    【解决方案1】:

    您提供给ArtistAnimation 的列表应该是艺术家列表,每帧一个列表。

    artist_list = [[line1a, line1b, title1], [line2a, line2b, title2], ...]
    

    第一个列表显示在第一帧中,第二个列表显示在第二帧等等。

    您的代码有效的原因是ax.plot 返回一个行列表(在您的情况下,只有一行的列表)。

    在任何情况下,以下可能是您的代码的更易于理解的版本,其中附加了动画。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    fig, ax = plt.subplots()
    
    artist_list = []
    for i in range(60):
        x = np.linspace(0,i,1000)
        y = np.sin(x)
        line, = ax.plot(x,y, color='black')
        text = ax.text(i,0,i)
        artist_list.append([line, text])
    
    ani = animation.ArtistAnimation(fig, artist_list, interval=50, blit=True,
                                    repeat_delay=1000)
    
    plt.show()
    

    一般来说,使用ArtistAnimation 为更改轴限制设置动画会很困难,因此如果这是最终目标,请考虑改用FuncAnimation

    【讨论】:

    • 嘿,谢谢你的澄清,我真的不明白 ArtistAnimation 是如何工作的。我看了一下 FuncAnimation,但 ArtistAnimation 似乎更直观。我认为这对我有用,我需要做的就是在缩放 x 轴后从轴中提取艺术家对象列表,这可能吗?假设我有一些函数 plot_sines(A) 返回一个 Figure 和 Axes 对象,其中 cos(A) 和 sin(A) 被很好地绘制覆盖和格式化,我如何提取所需的艺术家对象来为它们设置动画?您的示例仍然使用 ax.plot() 直接返回的艺术家对象
    • 这正是我在尝试为 everything 设置动画时所说的问题。因此,一个硬约束当然是动画在图形内部运行。如果您的函数在每次调用中创建一个新图形,则不能使用它。此外,应该可以对所有内容进行动画处理,但内存消耗的成本相当高。就我个人而言,我宁愿从一开始就使用FuncAnimation。这一点都不直观,特别是如果你有一个函数plot_sines(A),它实际上可能已经接近你需要它工作的东西。
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多