2017-09-27 17 views
-1

現在、私のWalabotデバイスから3D-rawdataを視覚化して、matplotlib FuncAnimationで作成した3Dアニメーションで表示したいと考えています。私はすでに回答を探していましたが、役に立たないものは見つかりませんでした。 私の場合、3次元配列を既に持っています。各インデックスには時間の経過と共に変化する特定の値があります。私はすでにさまざまな色とサイズの3Dチャートで表示する方法を理解することができましたが、今は自分でアップデートしたいと思っています。私は良いスタートを与えたいくつかのサンプルコードを見つけましたが、私のチャートはそれ自身では更新されません。私はウィンドウを閉じなければならないし、ウィンドウは再び3D配列から異なる値でポップアップします。あなたはこの問題を解決する方法を知っていますか?ここ は、これまでの私のコードです:Pythonの3D配列の値のMatplotlibアニメーション

def update(plot, signal, figure): 
    plot.clear() 
    scatterplot = plot.scatter(x, y, z, zdir='z', s=signal[0], c=signal[0]) 
    figure.show() 
    return figure 

def calc_RasterImage(signal): 
    # 3D index is represnted is the following schema {i,j,k} 
    # sizeX - signal[1] represents the i dimension length 
    # sizeY - signal[2] represents the j dimension length 
    # sizeZ - signal[3] represents the k dimension length 
    # signal[0][i][j][k] - represents the walabot 3D scanned image (internal data) 

    #Initialize 3Dplot with matplotlib      
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 
    ax.set_xlim([xMin-1,xMax-1]) 
    ax.set_ylim([yMin-1,yMax-1]) 
    ax.set_zlim([zMin-1,zMax-1]) 
    ax.set_xlabel('X AXIS') 
    ax.set_ylabel('Y AXIS') 
    ax.set_zlabel('Z AXIS') 
    scatterplot = ax.scatter(x, y, z, zdir='z', s=signal[0], c= signal[0]) 
    cbar = plt.colorbar(scatterplot) 
    cbar.set_label('Density') 
    #def update(signal): 
    #  ax.clear() 
    #  scatterplot = ax.scatter(x, y, z, zdir='z', s=signal[0], c=signal[0]) 
    ani = anim.FuncAnimation(fig, update(ax, signal, plt), frames=10 , blit=True, repeat = True) 

def main(): 
    wlbt = Walabot() 
    wlbt.connect() 
    if not wlbt.isConnected: 
      print("Not Connected") 
    else: 
      print("Connected") 
    wlbt.start() 
    calc_index(wlbt.get_RawImage_values()) 
    while True: 
      #print_RawImage_values(wlbt.get_RawImage_values()) 
      calc_RasterImage(wlbt.get_RawImage_values()) 
    wlbt.stop() 

if __name__ == '__main__': 
    main() 

あなたがトップから更新機能を必要とする

ani = anim.FuncAnimation(fig, update(ax, signal, plt), frames=10 , blit=True, repeat = True) 
を持つ行を見ることができるように。この関数は私のプロットを消去し、異なる値を持つ新しいプロットを再作成します。しかし、私は常に最初にプロットウィンドウを閉じる必要があります。これは避けたいものです。 これはプロットの様子です: 3D array plot with matplotlib scatter あなたはこの問題の解決方法を知っていますか?

歓声

答えて

0

あなたのコードは本当に最小限の作業例ではない、とあなたは怠惰であることと、実際にSOに来る前にFuncAnimationのためのドキュメントを読んではいけません。つまり、このようなものがうまくいくはずです:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

""" 
Display walabot output. 
""" 

import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation 

def display(walabot_instance): 

    # set x, y, z 

    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 
    path_collection = ax.scatter(x, y, z, zdir='z') 

    # do your labelling, layout etc 

    def update(ignored, walabot_instance): 
     signal = walabot_instance.get_RawImage_values() 
     path_collection.set_sizes(signal[0]) 
     path_collection.set_color(signal[1]) 
     return path_collection, 

    return FuncAnimation(fig, update, fargs=[walabot_instance]) 

def main(): 
    wlbt = Walabot() 
    wlbt.connect() 
    if not wlbt.isConnected: 
     print("Not Connected") 
    else: 
     print("Connected") 
    wlbt.start() 

    plt.ion() 
    animation = display(wlbt) 
    raw_input("Press any key when done watching Walabot...") 


if __name__ == "__main__": 
    main() 

ご質問がある場合は、コメントを削除してください。

+0

紛失したmcveを批判し、依然として回答を提供するのはちょっと矛盾しているようですが、それ自体には説明がありません。私は、質問の紛らわしさを質問者に思い出させることは、コメントでなければならないと思います。一方、あなたが質問に答えることができれば、なぜmcveが不足しているのか気にしませんか?または、それ以外の方法:なぜ質問が不明な場合に回答を提供するのですか?いずれにしても、コードを投げて「それを理解したい場合は、ドキュメントを読む」と言うのは同じように悪いことです。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest私は彼に最初にドキュメントを読んでから残りの質問をするように頼んだ。私は実際に言ったこととあなたがそれを描写していることの間に違いがあると主張します。 – Paul

0

ご協力いただきありがとうございます。あなたのコードを試してそれを私のものに調整した後、ついにそれが働きました。私はドキュメント(https://matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html#matplotlib.animation.FuncAnimation)を見ていましたが、それを正しく使う方法を理解できませんでした。私はコーディングがそれほど良くないからです。とにかく、ここで私の新しいコードされています

def calc_index(signal): 
    for i in range(0, signal[1], 1): 
      for j in range(0, signal[2], 1): 
        for k in range(0, signal[3], 1): 
          #Location of Index 
          x.append(i) 
          y.append(j) 
          z.append(k) 

def display(walabot_instance): 
    # 3D index is represnted is the following schema {i,j,k} 
    # sizeX - signal[1] represents the i dimension length 
    # sizeY - signal[2] represents the j dimension length 
    # sizeZ - signal[3] represents the k dimension length 
    # signal[0][i][j][k] - represents the walabot 3D scanned image (internal data) 

    #Initialize 3Dplot with matplotlib      
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 
    signal = walabot_instance.get_RawImage_values() 
    path_collection = ax.scatter(x, y, z, zdir='z', s=signal[0], c=signal[0]) 

    #Plot labeling 
    ax.set_xlim([xMin-1,xMax-1]) 
    ax.set_ylim([yMin-1,yMax-1]) 
    ax.set_zlim([zMin-1,zMax-1]) 
    ax.set_xlabel('X AXIS') 
    ax.set_ylabel('Y AXIS') 
    ax.set_zlabel('Z AXIS') 
    cbar = plt.colorbar(path_collection) 
    cbar.set_label('Density') 

    def update(ignored, walabot_instance): 
      ax.clear() 
      signal_update = walabot_instance.get_RawImage_values() 
      path_collection = ax.scatter(x, y, z, zdir='z', s=signal_update[0], c=signal_update[0]) 
      return path_collection 

    return FuncAnimation(fig, update, fargs=[walabot_instance]) 

def main(): 
    wlbt = Walabot() 
    wlbt.connect() 
    if not wlbt.isConnected: 
      print("Not Connected") 
    else: 
      print("Connected") 
    wlbt.start() 

    calc_index(wlbt.get_RawImage_values()) 
    plt.ion() 
    animation = display(wlbt) 

    raw_input("Press any key when done watching Walabot...") 
    wlbt.stop() 

if __name__ == '__main__': 
    main() 

私はまだ理解していない何があなたがのためにFuncAnimation機能で

fargs=[walabot_instance] 

を使用しているのですか?私はこの.. ドキュメントを得ることはありませんそして、何が

def func(fr: object, *fargs) -> iterable_of_artists: 

とFUNCとフレームのパラメータのFuncAnimationドキュメントの

def gen_function() -> obj: 

を意味しますか?このプロセスをよりよく理解するだけです。

なぜ更新に無視されたパラメータの入力が必要なのですか?それはどこにも使われていません。

ありがとう!

+0

'FuncAnimation'はあなたのユースケースのために設計されていません。 ユースケースは、すでに のすべてのデータを持っているか、または時間の関数としてシステムの の状態を表す関数を知っているため、確定的な動的な システムの進化を描写しています。従って、「更新」は、 時間を表す浮動小数または整数を期待し、これは システムの新しい状態、または新しい状態(生成器 関数またはデータ自体の形)を把握するために使用できます。 – Paul

+0

あなたのケースでは、システムの新しい状態は 実行時に決定されます。 はジェネレータのように見えますが(それはそうではありません)、あなたのインスタンスをラップすることができますが、それはあまりにも私に複雑なものになってしまいました。したがって、 'frame'引数は余分であり、私はそれを無視します。 – Paul

+0

'fargs'は、更新関数に追加のパラメータを渡すために使用されます。コードを見ると、おそらくそれを渡す必要はないと思いました(もともと、私はclosureとして 'update'関数を設計していませんでした。この場合、walabotのインスタンスはスコープに入っていませんでしたあなたがそれを渡す必要があったように)。 – Paul

関連する問題