2013-05-08 59 views
13

所以我有一些手機加速度計數據,我想基本製作一個視頻,看看手機的動作是什麼樣子的。所以我用matplotlib創建數據的3D圖形:與matplotlib實時更新

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() 

現在的時間是非常重要的,實際上也是我只看到一個點在時間因素,因爲時間也是一個因素,它讓我看加速度計數據的進展!

我該怎麼做才能讓它成爲實時更新圖表?

我唯一能想到的就是有一個循環遍歷並逐行生成圖形,但這會打開很多文件,因爲我擁有數百萬行,所以它會被瘋狂。

那麼如何創建一個實時更新圖?

回答

31

這是一個最基本的例子一樣快,因爲它可以更新:

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

它不會顯示任何東西... – 2013-05-08 17:36:28

+0

@RyanSaxe什麼操作系統和'matplotlib'你使用的是什麼版本?你是否說這個例子顯示了_nothing_? – Hooked 2013-05-08 18:17:04

+0

我在osx 10.8上使用linux。不管最近的版本是matplotlib,因爲我在2周前下載了它。當我運行它時,它打開了一個控制檯,但該圖從未出現或顯示 – 2013-05-08 18:26:27

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()