【问题标题】:Matplotlib 3D Scatter Animate Sequential DataMatplotlib 3D Scatter 动画序列数据
【发布时间】:2017-04-12 18:34:12
【问题描述】:

我制作了以下一些加速度计数据的 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 的示例,看起来他们正在使用随机生成的数据,然后对线条进行动画处理。我不确定如何编写更新每一行数据的图形的函数。

如果有人能指导我举一个正在做类似事情的例子,我将不胜感激。到目前为止,我的搜索只得到了数据由函数生成或随机生成的示例。

【问题讨论】:

    标签: python animation matplotlib plot scatter3d


    【解决方案1】:

    这个问题中有一个 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()
    

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2018-03-08
      • 2016-11-02
      • 2020-07-22
      • 2012-07-07
      相关资源
      最近更新 更多