Живое обновление с помощью matplotlib
Итак, у меня есть данные по акселерометрии телефона, и я хотел бы в основном сделать видео о том, как выглядело движение телефона. Поэтому я использовал 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()
Теперь время важно, и на самом деле это также фактор, который я вижу только по одной точке за раз, потому что время также является фактором, и это позволяет мне следить за прогрессированием данных акселерометрии!
Что я могу сделать с этим, чтобы сделать его живым графиком обновления?
Единственное, о чем я могу думать, это иметь цикл, который проходит по строке за строкой и делает граф из строки, но это откроет так много файлов, что это будет безумие, потому что у меня есть миллионы строк.
Итак, как я могу создать живой график обновления?
Ответы
Ответ 1
Вот пример bare-bones, который обновляется настолько быстро, насколько это возможно:
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()
, чтобы получить обновление, чтобы показать
Ответ 2
Мне удалось создать живое обновление с помощью 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()