2017-08-09 7 views
0

私は、matplotlibを使って複数の要素を単一の軸にアニメーション化する方法を解明しようとしています。 https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/のように1つの要素(行または画像のいずれか)を使用することができますが、2つの要素に拡張することは機能していないようです。matplotlibを使って複数の要素(matshowとline)を同時にアニメーション化するには?

私はいくつかの同様のスタックオーバーフローの質問を見ましたが、私は別の問題を抱えているようです。

ここで私が試したコードは次のとおりです。

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はちょうど1Dの配列なので、私はラインではなく各フレームに単一の点をプロットしています。私は: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に電話すると、作成されたすべてのLine2Dオブジェクトのリストが返されます。

注:.plotは一度に複数の行を生成できるので、リストを返します。 ax.plot(x1, y1, x2, y2, x3, y3)は3つのline2Dオブジェクトを生成します。

あなたのケースでは、1行しか作成されていないので、line_posの後にコンマを追加すると、1アイテムのリストを解凍して、必要なオブジェクトを残すことができます。

つまり、あなたが

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

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

を変更する必要があります

関連する問題