Matplotlib 3D动画散点图顺序数据

问题描述:

我产生了一些加速计数据的以下3D散点图:Matplotlib 3D动画散点图顺序数据

3D Scatter plot

这是非常基本的,但我很高兴,它看起来考虑的方式,这是我的首先尝试使用Python。下面是我写的,使这个可视化代码:

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

我想下一步要做的就是采取上述情节,并一次一个地点。有没有一个简单的方法来做到这一点?看看matplotlib中的示例,它看起来像是在使用随机生成的数据,然后为这些线条制作动画。我不知道如何编写更新数据每行数据的函数。

如果任何人都可以指导我做一个类似的事情,我真的很感激它。到目前为止,我的搜索只能让我看到数据是由函数生成还是随机生成的例子。

没有为这个问题的3D散点图的例子:Matplotlib 3D scatter animations

为了让点逐一出现,你会画出从数据帧中的数据从索引0上升到目前的动画指数i

(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