如何使用matplotlib同时为多个元素(matshow和line)制作动画?

时间:2017-08-09 14:16:40

标签: python animation matplotlib

我试图弄清楚如何使用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,),那么将它扩展到多个元素的简单方法就是使用包含所有元素的元组。但那只是猜测。

1 个答案:

答案 0 :(得分: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], '*')