2017-04-12 12 views
0

最初にPythonを使用しようとします。ここで私は、この可視化を行うために書いたコードは次のとおりです。matplotlibの3D散布アニメイト順次データ

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib 
matplotlib.style.use('ggplot') 
from mpl_toolkits.mplot3d import Axes3D 
from mpldatacursor import datacursor 

AccX = pd.read_csv('Data_Retrieval_April_05_2017.csv') 
AccX.columns = ['Tag', 'Timestamp', 'X'] 
AccX = AccX[AccX['Tag'].str.contains("ACC856:AccelerationX")] 
del AccX['Tag'] 

print(AccX.head()) 

AccY = pd.read_csv('Data_Retrieval_April_05_2017.csv') 
AccY.columns = ['Tag', 'Timestamp', 'Y'] 
AccY = AccY[AccY['Tag'].str.contains("ACC856:AccelerationY")] 
del AccY['Tag'] 

print(AccY.head()) 

AccZ = pd.read_csv('Data_Retrieval_April_05_2017.csv') 
AccZ.columns = ['Tag', 'Timestamp', 'Z'] 
AccZ = AccZ[AccZ['Tag'].str.contains("ACC856:AccelerationZ")] 
del AccZ['Tag'] 

print(AccZ.head()) 

Accel = AccX.merge(AccY,on='Timestamp').merge(AccZ,on='Timestamp') 

Accel = Accel.set_index(['Timestamp']) 

print(Accel.head()) 

Accel['X'] = Accel.X.astype(float) 
Accel['Y'] = Accel.Y.astype(float) 
Accel['Z'] = Accel.Z.astype(float) 

print(Accel.head()) 
print(Accel.dtypes) 

accelscat = plt.figure().gca(projection='3d') 
accelscat.scatter(Accel['X'],Accel['Y'],Accel['Z'], c='darkblue', alpha=0.5) 

accelscat.set_xlabel('X') 
accelscat.set_ylabel('Y') 
accelscat.set_zlabel('Z') 

plt.show() 

データは、タイムスタンプでインデックスされ、次のようになりますされています

enter image description here

私は次に何をしたいのですがどのようにされました上記のプロットを取って、各点を一度に1つずつ持って来てください。これを行う簡単な方法はありますか? matplotlibの例を見ると、ランダムに生成されたデータを使用しているように見えます。私は自分のデータの各行の図を更新する関数をどうやって書くのか分かりません。

誰かが同じようなことが行われている例に私を誘導できる人は、本当に感謝しています。これまでのところ、私の検索では、データが関数によって生成されていたか、ランダムに生成されたという事例しか得られませんでした。この質問では、3D散布図のための例があります

答えて

2

:ポイントはあなたが現在のアニメーションインデックスiまでのインデックス0で始まるデータフレームからのデータをプロットう一枚ずつ表示させるためにはMatplotlib 3D scatter animations

(df.x.values[:i], df.y.values[:i], df.z.values[:i]) 

完全例:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.animation 

x = np.random.normal(size=(80,3)) 
df = pd.DataFrame(x, columns=["x","y","z"]) 


fig = plt.figure() 
ax = fig.add_subplot(111,projection='3d') 
sc = ax.scatter([],[],[], c='darkblue', alpha=0.5) 

def update(i): 
    sc._offsets3d = (df.x.values[:i], df.y.values[:i], df.z.values[:i]) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
ax.set_xlim(-3,3) 
ax.set_ylim(-3,3) 
ax.set_zlim(-3,3) 

ani = matplotlib.animation.FuncAnimation(fig, update, frames=len(df), interval=70) 

plt.tight_layout() 
plt.show() 

enter image description here