2017-04-12 3 views
0

ich das folgende 3D-Streudiagramm einiger Beschleunigungssensordaten erzeugt habe:Matplotlib 3D Scatter Animate sequenzielle Daten

3D Scatter plot

Es ist ziemlich einfach, aber ich bin zufrieden mit der Art und Weise es angesichts sieht dies ist mein erster Versuch mit Python. Hier ist der Code, den ich schrieb diese Visualisierung zu machen:

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() 

Die Daten durch Zeitstempel indiziert ist, und sieht wie folgt aus:

enter image description here

Was Ich mag würde als nächstes zu tun ist Nimm die obige Handlung und lass jeden Punkt einzeln kommen. Gibt es eine einfache Möglichkeit, dies zu tun? Betrachtet man die Beispiele von matplotlib, sieht es so aus, als würden sie zufällig erzeugte Daten verwenden und dann die Linien animieren. Ich bin nicht sicher, wie ich die Funktion schreiben würde, die die Zahl für jede Reihe meiner Daten aktualisiert.

Wenn jemand mich zu einem Beispiel führen kann, wo etwas Ähnliches getan wird, würde ich es wirklich schätzen. Bis jetzt hat meine Suche nur Beispiele, wo die Daten von einer Funktion erzeugt wurden oder zufällig generiert wurden.

Antwort

2

Es ist ein Beispiel für die 3D-Streudiagramme in dieser Frage: Matplotlib 3D scatter animations

Um die Punkte erscheinen nacheinander Sie die Daten aus dem Datenrahmen würde plotten zu lassen Index beginnend bei 0 bis zum aktuellen Animationsindex i .

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

Ein vollständiges Beispiel:

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