So I have a 3d live-updating graph! it only shows one point at a time so I can easily track the motion of the point! But here is the problem:
No matter what I seem to do, the point is always placed in the center of the graph and the tick marks on the axis change in order to do that. This makes my life very difficult because I don't see the motion on the point. Here is my code:
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()
here is an example of the data:
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
So what can I do to make it so that the tick marks are fixed so the point moves rather than the tick marks changing?
An
Axes3D
object (yourax
variable) has the following methods:set_xlim
,set_ylim
, andset_zlim
. You could use these to fix the limits of your axes.Documentation:
Edit
Using
set_xlim
, etc, works for me. Here is my code:Edit 2
You could have a look at switching off autoscaling of axes which is on by default. Maybe this is overriding the
set_lim
methods.Documentation:
You probably want to hold your axis-ranges constant. This can be done, for example, by
axis()
.See also these answers:
How to set axis range
y-axis limit
enforce axis range
I ran into pretty much the exact same problem as you. I found one way to get it to work is to reset the axis limits each time you want to add a new point, so your loop would look something like:
I have a feeling resetting the limits everytime is a bad way to solve this, so I asked a question about it, and will hopefully find an answer. If all you want is to just see something working, then hopefully the limit changes within the loop will do the trick