【问题标题】:How animate multiple elements (matshow and line) at the same time with matplotlib?如何使用 matplotlib 同时为多个元素(matshow 和 line)制作动画?
【发布时间】:2017-08-09 22:36:02
【问题描述】:

我试图弄清楚如何使用 matplotlib 为单个轴上的多个元素设置动画。我可以通过以下方式使用单个元素(来自matshow 的线条或图像)来做到这一点:https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/ 但将其扩展到 2 个元素似乎不起作用。

我已经看到了一些其他类似的 stackoverflow 问题,但我似乎遇到了不同的问题。

这是我尝试过的代码:

    fig = plt.figure()
    ax = plt.axes(xlim=[-0.5, np.shape(first_cadence)[0]-0.5], ylim=[-0.5, np.shape(first_cadence)[1]+0.5])

    im = ax.matshow(first_cadence, animated=True)
    line_pos = ax.plot(x[0], y[0], '*')

    def initiate():
        im.set_array(f[0,'FLUX'])
        line_pos.set_data([], [])
        return (im, line_pos)

    def update(i):
        im.set_array(f[i,'FLUX'])
        line_pos.set_data([x[i]], [y[i]])
        return (im, line_pos)

    ani = animation.FuncAnimation(fig, update, range(0, len(f)), init_func=initiate, interval=50, blit=True)

    plt.show()

我收到一个很长的错误语句,结尾是:

AttributeError: 'list' object has no attribute 'set_data'

如果需要,我可以发布整个内容。有关更多信息,xy 只是一维数组,所以我在每一帧中绘制一个点,而不是一条线。即:x = [1.21, 1.20, 1.19, 1.23, ...]

所以我不知道出了什么问题。我的猜测是,这与我如何使用启动和更新功能返回元素有关。我想既然你应该返回一个带有单个元素版本的元组(即return line,),那么将它扩展到多个元素的简单方法是使用一个包含所有元素的元组。但这只是猜测。

【问题讨论】:

    标签: python animation matplotlib


    【解决方案1】:

    请注意,在该教程中,当他们设置line 时,您在设置line_pos 时省略了一个逗号。

    比较:

    line, = ax.plot([], [], lw=2)
    

    与:

    line_pos = ax.plot(x[0], y[0], '*')
    

    这是您的错误的根源。当您调用ax.plot 时,它会返回所有已创建Line2D 对象的列表。

    注意:它返回一个列表,因为.plot 可以一次生成多行,例如ax.plot(x1, y1, x2, y2, x3, y3) 将产生三个 line2D 对象。

    在您的情况下,您只创建了一行,因此您只需在 line_pos 之后添加一个逗号即可解压缩该单项列表,并留下您需要的 Line2D 对象。

    即你应该改变

    line_pos = ax.plot(x[0], y[0], '*')
    

    line_pos, = ax.plot(x[0], y[0], '*')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多