Matplotlib 3D动画散点图顺序数据
问题描述:
我产生了一些加速计数据的以下3D散点图:Matplotlib 3D动画散点图顺序数据
这是非常基本的,但我很高兴,它看起来考虑的方式,这是我的首先尝试使用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()
的数据由时间戳索引,并且看起来是这样的:
我想下一步要做的就是采取上述情节,并一次一个地点。有没有一个简单的方法来做到这一点?看看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()