Matplotlib 3d-сюжет с меняющимися метками
Итак, у меня есть 3D-график обновления в реальном времени! он показывает только одну точку за раз, поэтому я могу легко отслеживать движение точки! Но вот проблема:
Независимо от того, что я делаю, точка всегда помещается в центр графика, и для этого меняются отметки на оси. Это делает мою жизнь очень трудной, потому что я не вижу движения по делу. Вот мой код:
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
labels = range(-10,11)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_yticklabels(labels)
ax.set_xticklabels(labels)
ax.set_zticklabels(labels)
lin = None
while plotting:
df2 = df.ix[count]
count += 1
xs = df2['x.mean']
ys = df2['y.mean']
zs = df2['z.mean']
t = df2['time']
ax.set_title(t)
if lin is not None:
lin.remove()
lin = ax.scatter(xs, ys, zs)
draw()
pause(0.01)
if count > 100:
plotting = False
ioff()
show()
Вот пример данных:
x.mean y.mean z.mean time
0 -1.982905 3.395062 8.558263 2012-01-18 14:00:03
1 0.025276 -0.399172 7.404849 2012-01-18 14:00:04
2 -0.156906 -8.875595 1.925565 2012-01-18 14:00:05
3 2.643088 -8.307801 2.382624 2012-01-18 14:00:06
4 3.562265 -7.875230 2.312898 2012-01-18 14:00:07
5 4.441432 -7.907592 2.851774 2012-01-18 14:00:08
6 4.124187 -7.854146 2.727229 2012-01-18 14:00:09
7 4.199698 -8.135596 2.677706 2012-01-18 14:00:10
8 4.407856 -8.133449 2.214902 2012-01-18 14:00:11
9 4.096238 -8.453822 1.359692 2012-01-18 14:00:12
Так что я могу сделать, чтобы сделать так, чтобы отметки фиксировались так, чтобы точки перемещались, а не изменялись?
3 ответа
Axes3D
объект (ваш ax
переменная) имеет следующие методы: set_xlim
, set_ylim
, а также set_zlim
, Вы можете использовать их, чтобы исправить пределы ваших осей.
Документация:
редактировать
С помощью set_xlim
и т. д., работает для меня. Вот мой код:
#!python2
from mpl_toolkits.mplot3d import Axes3D
from pylab import *
data = [
[-1.982905, 3.395062, 8.558263, '2012-01-18 14:00:03'],
[ 0.025276, -0.399172, 7.404849, '2012-01-18 14:00:04'],
[-0.156906, -8.875595, 1.925565, '2012-01-18 14:00:05'],
[ 2.643088, -8.307801, 2.382624, '2012-01-18 14:00:06'],
[3.562265, -7.875230, 2.312898, '2012-01-18 14:00:07'],
[4.441432, -7.907592, 2.851774, '2012-01-18 14:00:08'],
[4.124187, -7.854146, 2.727229, '2012-01-18 14:00:09'],
[4.199698, -8.135596, 2.677706, '2012-01-18 14:00:10'],
[4.407856, -8.133449, 2.214902, '2012-01-18 14:00:11'],
[4.096238, -8.453822, 1.359692, '2012-01-18 14:00:12'],
]
ion()
fig = figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_xlim((-10, 11))
ax.set_ylim((-10, 11))
ax.set_zlim((-10, 11))
lin = None
for x, y, z, t in data:
ax.set_title(t)
if lin is not None:
lin.remove()
lin = ax.scatter(x, y, z)
draw()
pause(0.1)
ioff()
show()
Редактировать 2
Вы можете посмотреть на отключение автоматического масштабирования осей, которое включено по умолчанию. Может быть, это отменяет set_lim
методы.
Документация:
Я столкнулся почти с той же проблемой, что и вы. Я нашел один способ заставить его работать, это сбрасывать пределы оси каждый раз, когда вы хотите добавить новую точку, чтобы ваш цикл выглядел примерно так:
while plotting:
df2 = df.ix[count]
count += 1
xs = df2['x.mean']
ys = df2['y.mean']
zs = df2['z.mean']
t = df2['time']
ax.set_title(t)
if lin is not None:
lin.remove()
lin = ax.scatter(xs, ys, zs)
ax.set_xlim((-10, 11))
ax.set_ylim((-10, 11))
ax.set_zlim((-10, 11))
draw()
pause(0.01)
if count > 100:
plotting = False
У меня есть чувство, что каждый раз сбрасывать лимиты - плохой способ решить эту проблему, поэтому я задал вопрос об этом и, надеюсь, найду ответ. Если все, что вам нужно, это просто увидеть что-то работающее, то, надеюсь, изменения пределов в цикле сделают свое дело
Вы, вероятно, хотите сохранить свои диапазоны осей постоянными. Это может быть сделано, например, axis()
,
Смотрите также эти ответы:
Как установить диапазон оси
предел оси Y
применять диапазон оси