16

所以我有一些手机加速度测量数据,我想基本上制作一段手机运动的视频。所以我使用 matplotlib 创建数据的 3D 图:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas as pd
import pickle
def pickleLoad(pickleFile):
    pkl_file = open(pickleFile, 'rb')
    data = pickle.load(pkl_file)
    pkl_file.close()
    return data
data = pickleLoad('/Users/ryansaxe/Desktop/kaggle_parkinsons/accelerometry/LILY_dataframe')
data = data.reset_index(drop=True)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xs = data['x.mean']
ys = data['y.mean']
zs = data['z.mean']
ax.scatter(xs, ys, zs)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

现在时间很重要,实际上也是一个因素,我一次只能看到一个点,因为时间也是一个因素,它让我观察加速度数据的进展!

我该怎么做才能使它成为实时更新图?

我唯一能想到的就是有一个循环,逐行遍历并从行中生成图表,但这会打开很多文件,因为我有数百万行,所以这会很疯狂。

那么如何创建实时更新图呢?

4

2 回答 2

36

这是一个尽可能快地更新的简单示例:

import pylab as plt
import numpy as np

X = np.linspace(0,2,1000)
Y = X**2 + np.random.random(X.shape)

plt.ion()
graph = plt.plot(X,Y)[0]

while True:
    Y = X**2 + np.random.random(X.shape)
    graph.set_ydata(Y)
    plt.draw()

诀窍不是不断创建新图形,因为这将继续消耗内存,而是更改现有绘图上的 x、y、z 数据。像这样使用.ion().draw()设置画布进行更新。

附录:@Kelsey 下面的一个高度评价的评论指出:

您可能需要在行plt.pause(0.01)plt.draw()才能显示刷新

于 2013-05-08T17:25:27.553 回答
1

我能够使用draw()while循环创建实时更新,这是我使用的代码:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from pylab import *
import time
import pandas as pd
import pickle
def pickleLoad(pickleFile):
    pkl_file = open(pickleFile, 'rb')
    data = pickle.load(pkl_file)
    pkl_file.close()
    return data
data = pickleLoad('/Users/ryansaxe/Desktop/kaggle_parkinsons/accelerometry/LILY_dataframe')
data = data.reset_index(drop=True)
df = data.ix[0:,['x.mean','y.mean','z.mean','time']]
ion()
fig = figure()
ax = fig.add_subplot(111, projection='3d')
count = 0
plotting = True
while plotting:
    df2 = df.ix[count]
    count += 1
    xs = df2['x.mean']
    ys = df2['y.mean']
    zs = df2['z.mean']
    t = df2['time']
    ax.scatter(xs, ys, zs)
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    ax.set_title(t)
    draw()
    pause(0.01)
    if count > 50:
        plotting = False
ioff()
show()
于 2013-05-08T19:30:23.387 回答