2017-08-09 172 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], '*')