2017-08-09 131 views
0

我想弄清楚如何使用matplotlib动画单轴上的多个元素。我可以通过以下方式使用单个元素(来自matshow的行或图像):https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/,但将其扩展为2个元素似乎不起作用。如何使用matplotlib同时动画多个元素(matshow和line)?

我见过其他一些类似的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只是一维数组,所以我在每一帧绘制一个点,而不是一条线。 I.e:x = [1.21, 1.20, 1.19, 1.23, ...]

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

回答

1

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

比较:

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

有:

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

这是你错误的根源。当您拨打ax.plot时,它将返回所有创建的对象的列表。

注意:它返回一个列表,因为.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], '*')