所以我有一些手机加速度计数据,我想基本上制作一个视频,看看手机的动作是什么样的。所以我用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()
现在时间很重要,实际上也是一个因素,我一次只能看到一个点,因为时间也是一个因素,它让我可以看到加速度数据的进展!
如何才能使其成为实时更新图表?
我唯一能想到的就是有一个循环逐行遍历并从行中生成图形,但这会打开这么多文件,因为我有数百万行,所以它会疯了。
那我该如何创建实时更新图?
答案 0 :(得分:33)
这是一个简单的例子,可以尽快更新:
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()
才能获得显示的刷新次数
答案 1 :(得分: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()