2013-05-08 22 views
13

Mam więc dane dotyczące akcelerometrii telefonicznej i chciałbym zrobić wideo z tego, jak wyglądał ruch telefonu. Więc użyłem matplotlib stworzyć 3D wykres danych:Aktualizacja na żywo z 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() 

Teraz czas jest ważne i jest faktycznie również czynnikiem, który widzę tylko jeden punkt w czasie, bo czas jest również czynnikiem, a to pozwala mi oglądać postęp w danych akcelerometrycznych!

Co mogę zrobić, aby był to wykres aktualizujący na żywo?

Jedyne, co mogę wymyślić, to mieć pętlę, która przechodzi wiersz po wierszu i tworzy wykres z wiersza, ale to otworzy tak wiele plików, że byłoby to szalone, ponieważ mam miliony wierszy.

Jak mogę utworzyć aktualizację na żywo?

Odpowiedz

31

Oto przykład goły że aktualizuje tak szybko, jak to możliwe:

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

Sztuką jest nie zachować tworzenie nowych wykresów jak będzie to nadal jeść pamięć, ale aby zmienić x, y, z-dane na istniejącym wykresie. Użyj opcji .ion() i konfigurowania obszaru roboczego w celu aktualizacji w ten sposób.

Uzupełnienie: Wysoko w rankingu komentarz poniżej @Kelsey zauważa, że:

może być potrzebny plt.pause(0.01) po linii plt.draw() uzyskać odświeżanie pokazać

+1

nie pokaże mi niczego ... –

+0

@RyanSaxe Jakiego systemu operacyjnego i jakiej wersji 'matplotlib' używasz? Czy mówisz, że _nothing_ pokazuje się z tym przykładem? – Hooked

+0

Używam linuxa na osxie 10.8. I niezależnie od najnowszej wersji jest matplotlib, ponieważ pobrałem go 2 tygodnie temu. A kiedy to uruchomię, otwiera się konsola, ale wykres nigdy nie odbiera ani nie pokazuje –

1

Mogłem utwórz aktualizację na żywo za pomocą draw(), a pętla while to kod, którego użyłem:

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