Private
Public Access
1
0

Cumulative Flex Plot v1

This commit is contained in:
sanderroosendaal
2016-10-31 15:18:11 +01:00
parent bb39d2b0af
commit 49f93da544
121 changed files with 362 additions and 465 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,76 +0,0 @@
# The following code is tested on Django 1.7
import django
import sys
import logging
from django.apps import apps
from django.db.migrations.recorder import MigrationRecorder
if django.get_version() > '1.7':
from django.core.serializers import sort_dependencies
else:
from django.core.management.commands.dumpdata import sort_dependencies
LOG_FORMAT = '%(asctime)s|%(levelname)s|%(message)s'
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=LOG_FORMAT)
logger = logging.getLogger(__name__)
def copy(model):
table_name = model._meta.db_table
logger.info('Start import %s into new_db' % table_name)
table_objects = model.objects.all()
for t in table_objects:
t.save(using='new_db')
logger.info('Successfuly imported %s into new_db' % table_name)
'''
Please note that the id for many to many objects might be diffrent from source table.
This is because id is not specified in the add method.
'''
def copy_m2m(model, m2m_field):
table_name = m2m_field.rel.through._meta.db_table
field_name = m2m_field.name
to_model = m2m_field.rel.to
pk_name = model._meta.pk.name
child_pk_name = to_model._meta.pk.name
logger.info('Start import %s into new_db' % table_name)
for o in model.objects.all():
pk_value = getattr(o, pk_name)
new_o = model.objects.using('new_db').get(**{pk_name: pk_value})
for child in getattr(o, field_name).all():
child_pk_value = getattr(child, child_pk_name)
new_child = to_model.objects.using('new_db').get(**{child_pk_name: child_pk_value})
getattr(new_o, field_name).add(new_child)
logger.info('Successfuly imported %s into new_db' % table_name)
def run():
logger.info('Start move data into new_db')
app_configs = apps.get_app_configs()
app_list = [(a, None) for a in app_configs]
models = sort_dependencies(app_list)
models_with_m2m = []
for m in models:
copy(m)
if m._meta.many_to_many:
models_with_m2m.append(m)
# Migration model needs to copy separately as it is not in the INSTALLED_APPS
copy(MigrationRecorder.Migration)
# re-create object in ManyToManyField
for m in models_with_m2m:
for field in m._meta.many_to_many:
# data for field that has specific through model should have been copied in earlier steps
if field.rel.through._meta.auto_created:
copy_m2m(m, field)
logger.info('Successfully moved data into new_db')

View File

@@ -1,189 +0,0 @@
alabaster==0.7.7
amqp==1.4.9
anaconda-client==1.4.0
anaconda-navigator==1.1.0
anyjson==0.3.3
argcomplete==1.0.0
astropy==1.1.2
Babel==2.2.0
backports-abc==0.4
backports.ssl-match-hostname==3.4.0.2
beautifulsoup4==4.4.1
billiard==3.3.0.23
bitarray==0.8.1
blaze==0.9.1
bokeh==0.11.1
boto==2.39.0
Bottleneck==1.0.0
cairocffi==0.7.2
cdecimal==2.3
celery==3.1.23
certifi==2016.2.28
cffi==1.5.2
chest==0.2.3
click==6.6
cloudpickle==0.1.1
clyent==1.2.1
colorama==0.3.7
comtypes==1.1.2
conda==4.0.5
conda-build==1.20.0
conda-env==2.4.5
conda-manager==0.3.1
configobj==5.0.6
cryptography==1.3
cycler==0.10.0
Cython==0.23.4
cytoolz==0.7.5
dask==0.8.1
datashape==0.5.1
decorator==4.0.9
dill==0.2.4
Django==1.9.5
django-braces==1.8.1
django-celery==3.1.17
django-cors-headers==1.1.0
django-durationfield==0.5.2
django-modelcluster==1.1
django-oauth-toolkit==0.10.0
django-rq==0.9.0
django-taggit==0.18.1
django-translation-manager==0.3.4
django-treebeard==4.0
djangorestframework==3.3.3
docopt==0.6.2
docutils==0.12
enum34==1.1.2
et-xmlfile==1.0.1
fastcache==1.0.2
filemagic==1.6
Flask==0.10.1
Flask-Cors==2.1.2
Flask-Login==0.3.2
Flask-OpenID==1.2.5
Flask-Uploads==0.2.0
flower==0.9.1
funcsigs==0.4
future==0.15.2
futures==3.0.3
gevent==1.1.0
greenlet==0.4.9
grin==1.2.1
gunicorn==19.4.5
h5py==2.5.0
HeapDict==1.0.0
html5lib==0.9999999
httplib2==0.9.2
idna==2.0
ipaddress==1.0.14
ipykernel==4.3.1
ipython==4.1.2
ipython-genutils==0.1.0
ipywidgets==4.1.1
itsdangerous==0.24
jdcal==1.2
jedi==0.9.0
Jinja2==2.8
jsonschema==2.4.0
jupyter==1.0.0
jupyter-client==4.2.2
jupyter-console==4.1.1
jupyter-core==4.1.0
kombu==3.0.35
libmagic==1.0
llvmlite==0.9.0
locket==0.2.0
lxml==3.6.0
MarkupSafe==0.23
matplotlib==1.5.1
mechanize==0.2.5
menuinst==1.3.2
mistune==0.7.2
mpld3==0.2
mpmath==0.19
multipledispatch==0.4.8
nbconvert==4.1.0
nbformat==4.0.1
networkx==1.11
nltk==3.2
nose==1.3.7
notebook==4.1.0
numba==0.24.0
numexpr==2.5
numpy==1.11.0
oauth2==1.9.0.post1
oauthlib==1.0.3
odo==0.4.2
openpyxl==2.3.2
pandas==0.18.0
partd==0.3.2
path.py==0.0.0
patsy==0.4.0
pep8==1.7.0
pickleshare==0.5
Pillow==3.1.1
ply==3.8
polib==1.0.7
psutil==4.1.0
py==1.4.31
pyasn1==0.1.9
pycosat==0.6.1
pycparser==2.14
pycrypto==2.6.1
pyflakes==1.1.0
Pygments==2.1.1
pymarc==3.1.1
pyOpenSSL==0.15.1
pyparsing==2.0.3
pypi-data==0.1.4
pypilist==0.1.0
pyreadline==2.1
pytest==2.8.5
python-dateutil==2.5.1
python-magic==0.4.11
python-openid==2.2.5
pytz==2016.4
pywin32==220
PyYAML==3.11
pyzmq==15.2.0
QtAwesome==0.3.2
qtconsole==4.2.0
QtPy==1.0
redis==2.10.5
requests==2.9.1
requests-oauthlib==0.6.1
rope==0.9.4
rowingdata==0.80.4
rowingphysics==0.2.4
rq==0.6.0
scikit-image==0.12.3
scikit-learn==0.17.1
scipy==0.17.0
simplegeneric==0.8.1
singledispatch==3.4.0.3
six==1.10.0
snowballstemmer==1.2.1
sockjs-tornado==1.0.1
South==1.0.2
sphinx==1.3.5
sphinx-pypi-upload==0.2.1
sphinx-rtd-theme==0.1.9
spyder==2.3.8
SQLAlchemy==1.0.12
statsmodels==0.6.1
sympy==1.0
tables==3.2.2
toolz==0.7.4
tornado==4.2
tqdm==4.4.0
traitlets==4.2.1
unicodecsv==0.14.1
Unidecode==0.4.19
virtualenv==15.0.1
wagtail==1.4.3
Werkzeug==0.11.4
Willow==0.3
xlrd==0.9.4
XlsxWriter==0.8.4
xlwings==0.7.0
xlwt==1.0.0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -787,6 +787,12 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
thedata['driveenergy'] = thedata[' DriveLength (meters)']*thedata[' AverageDriveForce (lbs)']*4.44822
# throw out zeros from dataframe
thedata = thedata[thedata[csvcolumns[yparam1]] > 0]
thedata = thedata[thedata[csvcolumns[xparam]] > 0]
if yparam2 != 'None':
thedata = thedata[thedata[csvcolumns[yparam2]] > 0]
spm = thedata.ix[:,csvcolumns['spm']]
f = thedata['TimeStamp (sec)'].diff().mean()
@@ -806,8 +812,6 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
thedata['drivespeed'] = drivelength/thedata[' DriveTime (ms)']*1.0e3
# get user
# u = User.objects.get(id=row.user.id)
x1 = thedata.ix[:,csvcolumns[xparam]]
@@ -819,9 +823,31 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
if xparam=='time':
xaxmax = x1.max()
xaxmin = x1.min()
xaxmax = get_datetimes([x1.max()])[0]
xaxmin = get_datetimes([x1.min()])[0]
x1 = get_datetimes(x1,tzinfo=1)
elif xparam=='distance':
xaxmax = x1.max()
xaxmin = x1.min()
else:
xaxmax = yaxmaxima[xparam]
xaxmin = yaxminima[xparam]
# average values
if xparam != 'time':
x1mean = x1.mean()
else:
x1mean = 0
y1mean = y1.mean()
y2mean = y2.mean()
if xparam != 'time':
xvals = xaxmin+np.arange(100)*(xaxmax-xaxmin)/100.
else:
xvals = np.arange(100)
x_axis_type = 'linear'
y_axis_type = 'linear'
@@ -836,7 +862,6 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
time = thedata.ix[:,csvcolumns['time']]
time = time-time[0]
hr = thedata.ix[:,csvcolumns['hr']]
if windowsize > 3:
@@ -849,6 +874,7 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
power = thedata.ix[:,csvcolumns['power']]
# Add hover to this comma-separated string and see what changes
if (promember==1):
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair'
@@ -856,11 +882,21 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair'
plot = Figure(x_axis_type=x_axis_type,y_axis_type=y_axis_type,
plot_width=900,
tools=TOOLS,
toolbar_location="above",
toolbar_sticky=False)
x1means = Span(location=x1mean,dimension='height',line_color='green',
line_dash=[6,6], line_width=2)
y1means = Span(location=y1mean,dimension='width',line_color='blue',
line_dash=[6,6],line_width=2)
y2means = y1means
if (xparam != 'time') and (xparam != 'distance'):
plot.add_layout(x1means)
plot.add_layout(y1means)
source = ColumnDataSource(
data = dict(
@@ -877,9 +913,24 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
)
)
source2 = ColumnDataSource(
data = dict(
x1=x1,
y1=y1,
y2=y2,
time=niceformat(get_datetimes(time,tzinfo=1)),
pace=nicepaceformat(get_datetimes(pace)),
hr = hr,
spm = spm,
spmc=np.rint(10*spm)/10.,
distance=distance,
power=power,
)
)
# plot.circle('x1','y1',source=source,legend=yparam1,size=3)
plot.circle('x1','y1',source=source,fill_alpha=0.3,line_color=None,
plot.circle('x1','y1',source=source2,fill_alpha=0.3,line_color=None,
legend=yparamname1,
)
@@ -921,11 +972,17 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
plot.circle('x1','y2',color="red",y_range_name="yax2",
legend=yparamname2,
source=source,fill_alpha=0.3,line_color=None)
source=source2,fill_alpha=0.3,line_color=None)
plot.add_layout(LinearAxis(y_range_name="yax2",
axis_label=axlabels[yparam2]),'right')
y2means = Span(location=y2mean,dimension='width',line_color='red',
line_dash=[6,6],line_width=2,y_range_name="yax2")
plot.add_layout(y2means)
hover = plot.select(dict(type=HoverTool))
@@ -939,11 +996,119 @@ def interactive_cum_flex_chart(theworkouts,promember=0,
hover.mode = 'mouse'
callback = CustomJS(args = dict(source=source,source2=source2,
x1means=x1means,
y1means=y1means,
y2means=y2means), code="""
var data = source.data
var data2 = source2.data
var x1 = data['x1']
var y1 = data['y1']
var y2 = data['y2']
var spm1 = data['spm']
var time1 = data['time']
var pace1 = data['pace']
var hr1 = data['hr']
var spmc1 = data['spmc']
var distance1 = data['distance']
var power1 = data['power']
var minspm = minspm.value
var maxspm = maxspm.value
var mindist = mindist.value
var maxdist = maxdist.value
var xm = 0
var ym1 = 0
var ym2 = 0
data2['x1'] = []
data2['y1'] = []
data2['y2'] = []
data2['spm'] = []
data2['time'] = []
data2['pace'] = []
data2['hr'] = []
data2['spmc'] = []
data2['distance'] = []
data2['power'] = []
data2['x1mean'] = []
data2['y1mean'] = []
data2['y2mean'] = []
data2['xvals'] = []
data2['y1vals'] = []
data2['y2vals'] = []
for (i=0; i<x1.length; i++) {
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
data2['x1'].push(x1[i])
data2['y1'].push(y1[i])
data2['y2'].push(y2[i])
data2['spm'].push(spm1[i])
data2['time'].push(time1[i])
data2['pace'].push(pace1[i])
data2['hr'].push(hr1[i])
data2['spmc'].push(spmc1[i])
data2['distance'].push(distance1[i])
data2['power'].push(power1[i])
xm += x1[i]
ym1 += y1[i]
ym2 += y2[i]
}
}
}
xm /= data2['x1'].length
ym1 /= data2['x1'].length
ym2 /= data2['x1'].length
data2['x1mean'] = [xm,xm]
data2['y1mean'] = [ym1,ym1]
data2['y2mean'] = [ym2,ym2]
x1means.location = xm
y1means.location = ym1
y2means.location = ym2
source2.trigger('change');
""")
slider_spm_min = Slider(start=15.0, end=55,value=15.0, step=.1,
title="Min SPM",callback=callback)
callback.args["minspm"] = slider_spm_min
slider_spm_max = Slider(start=15.0, end=55,value=55.0, step=.1,
title="Max SPM",callback=callback)
callback.args["maxspm"] = slider_spm_max
distmax = 100+100*int(distance.max()/100.)
slider_dist_min = Slider(start=0,end=distmax,value=0,step=1,
title="Min Distance",callback=callback)
callback.args["mindist"] = slider_dist_min
slider_dist_max = Slider(start=0,end=distmax,value=distmax,
step=1,
title="Max Distance",callback=callback)
callback.args["maxdist"] = slider_dist_max
layout = layoutrow([layoutcolumn([slider_spm_min,
slider_spm_max,
slider_dist_min,
slider_dist_max,
],
),
plot])
script, div = components(layout)
js_resources = INLINE.render_js()
css_resources = INLINE.render_css()
script, div = components(plot)
return [script,div]
return [script,div,js_resources,css_resources]

Binary file not shown.

View File

@@ -21,6 +21,7 @@ from bokeh.models import (
GMapPlot, GMapOptions, ColumnDataSource, Circle,
DataRange1d, PanTool, WheelZoomTool, BoxSelectTool,
SaveTool, ResizeTool, ResetTool, TapTool,CrosshairTool,BoxZoomTool,
Span,
)
#from bokeh.models.widgets import Slider, Select, TextInput
from bokeh.core.properties import value
@@ -1394,29 +1395,26 @@ def interactive_flex_chart2(id=0,promember=0,
xaxmax = get_datetimes([xaxmax],tzinfo=1)[0]
xaxmin = get_datetimes([xaxmin],tzinfo=1)[0]
x1 = get_datetimes(x1,tzinfo=1)
if xparam=='distance':
elif xparam=='distance':
xaxmax = x1.max()
xaxmin = x1.min()
else:
xaxmax = yaxmaxima[xparam]
xaxmin = yaxminima[xparam]
# average values
y1mean = y1.mean()+0.0*np.arange(100)
y2mean = y2.mean()+0.0*np.arange(100)
if xparam != 'time':
x1mean = x1.mean()+0.0*np.arange(100)
x1mean = x1.mean()
else:
x1mean = 0+0.0*np.arange(100)
x1mean = 0
y1mean = y1.mean()
y2mean = y2.mean()
if xparam != 'time' and xparam != 'distance' and yparam1 != 'pace':
xvals = yaxminima[xparam]+np.arange(100)*(yaxmaxima[xparam]-yaxminima[xparam])/100.
y1vals = yaxminima[yparam1]+np.arange(100)*(yaxmaxima[yparam1]-yaxminima[yparam1])/100.
if xparam != 'time':
xvals = xaxmin+np.arange(100)*(xaxmax-xaxmin)/100.
else:
xvals = np.arange(100)
y1vals = np.arange(100)
# constant power plot
if yparam1 == 'driveenergy':
@@ -1466,11 +1464,10 @@ def interactive_flex_chart2(id=0,promember=0,
spmc=np.rint(10*spm)/10.,
distance=distance,
power=power,
xvals=xvals,
y1mean=y1mean,
y2mean=y2mean,
x1mean=x1mean,
y1vals=y1vals,
# xvals=xvals,
y1mean=[y1mean,y1mean],
y2mean=[y2mean,y2mean],
x1mean=[x1mean,x1mean],
)
)
@@ -1487,11 +1484,10 @@ def interactive_flex_chart2(id=0,promember=0,
spmc=np.rint(10*spm)/10.,
distance=distance,
power=power,
xvals=xvals,
y1mean=y1mean,
y2mean=y2mean,
x1mean=x1mean,
y1vals=y1vals,
# xvals=xvals,
y1mean=[y1mean,y1mean],
y2mean=[y2mean,y2mean],
x1mean=[x1mean,x1mean],
)
)
@@ -1510,9 +1506,109 @@ def interactive_flex_chart2(id=0,promember=0,
toolbar_sticky=False,
# plot_width=900,
)
x1means = Span(location=x1mean,dimension='height',line_color='green',
line_dash=[6,6], line_width=2)
y1means = Span(location=y1mean,dimension='width',line_color='blue',
line_dash=[6,6],line_width=2)
y2means = y1means
if (xparam != 'time') and (xparam != 'distance'):
plot.add_layout(x1means)
plot.add_layout(y1means)
callback = CustomJS(args = dict(source=source,source2=source2), code="""
# average values
if yparam1 == 'driveenergy':
if xparam == 'spm':
plot.line(xvals,yconstantpower,color="green",legend="Constant Power")
if plottype=='line':
plot.line('x1','y1',source=source2,legend=axlabels[yparam1])
elif plottype=='scatter':
# plot.circle('x1','y1',source=source2,legend=yparam1,size=3)
plot.scatter('x1','y1',source=source2,legend=axlabels[yparam1],fill_alpha=0.4,
line_color=None)
plot.title.text = row.name
plot.title.text_font_size=value("1.0em")
plot.xaxis.axis_label = axlabels[xparam]
plot.yaxis.axis_label = axlabels[yparam1]
yrange1 = Range1d(start=yaxminima[yparam1],end=yaxmaxima[yparam1])
plot.y_range = yrange1
if (xparam != 'time') and (xparam != 'distance'):
xrange1 = Range1d(start=yaxminima[xparam],end=yaxmaxima[xparam])
plot.x_range = xrange1
if xparam == 'time':
xrange1 = Range1d(start=xaxmin,end=xaxmax)
plot.x_range = xrange1
plot.xaxis[0].formatter = DatetimeTickFormatter(
hours = ["%H"],
minutes = ["%M"],
seconds = ["%S"],
days = ["0"],
months = [""],
years = [""]
)
if yparam1 == 'pace':
plot.y_range = Range1d(ymin,ymax)
plot.yaxis[0].formatter = DatetimeTickFormatter(
seconds = ["%S"],
minutes = ["%M"]
)
if yparam2 != 'None':
yrange2 = Range1d(start=yaxminima[yparam2],end=yaxmaxima[yparam2])
plot.extra_y_ranges = {"yax2": yrange2}
if plottype=='line':
plot.line('x1','y2',color="red",y_range_name="yax2",
legend=axlabels[yparam2],
source=source2)
elif plottype=='scatter':
# plot.circle(x1,y2,color="red",y_range_name="yax2",legend=yparam2,
# source=source,size=3)
plot.scatter('x1','y2',source=source2,legend=axlabels[yparam2]
,fill_alpha=0.4,
line_color=None,color="red",y_range_name="yax2")
plot.add_layout(LinearAxis(y_range_name="yax2",
axis_label=axlabels[yparam2]),'right')
y2means = Span(location=y2mean,dimension='width',line_color='red',
line_dash=[6,6],line_width=2,y_range_name="yax2")
plot.add_layout(y2means)
hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([
('Time','@time'),
('Distance','@distance'),
('Pace','@pace'),
('HR','@hr'),
('SPM','@spmc{1.1}'),
('Power','@power{int}'),
])
hover.mode = 'mouse'
callback = CustomJS(args = dict(source=source,source2=source2,
x1means=x1means,
y1means=y1means,
y2means=y2means), code="""
var data = source.data
var data2 = source2.data
var x1 = data['x1']
@@ -1568,6 +1664,7 @@ def interactive_flex_chart2(id=0,promember=0,
xm += x1[i]
ym1 += y1[i]
ym2 += y2[i]
}
}
}
@@ -1579,10 +1676,9 @@ def interactive_flex_chart2(id=0,promember=0,
data2['x1mean'] = [xm,xm]
data2['y1mean'] = [ym1,ym1]
data2['y2mean'] = [ym2,ym2]
data2['xvals'] = [0,3e4]
data2['y1vals'] = [0,3e4]
data2['y2vals'] = [0,3e4]
x1means.location = xm
y1means.location = ym1
y2means.location = ym2
source2.trigger('change');
""")
@@ -1606,89 +1702,6 @@ def interactive_flex_chart2(id=0,promember=0,
step=1,
title="Max Distance",callback=callback)
callback.args["maxdist"] = slider_dist_max
# average values
plot.line('xvals','y1mean',color="black",source=source2)
plot.line('x1mean','y1vals',color="black",source=source2)
if yparam1 == 'driveenergy':
if xparam == 'spm':
plot.line(xvals,yconstantpower,color="green",legend="Constant Power")
if plottype=='line':
plot.line('x1','y1',source=source2,legend=axlabels[yparam1])
elif plottype=='scatter':
# plot.circle('x1','y1',source=source2,legend=yparam1,size=3)
plot.scatter('x1','y1',source=source2,legend=axlabels[yparam1],fill_alpha=0.4,
line_color=None)
plot.title.text = row.name
plot.title.text_font_size=value("1.0em")
plot.xaxis.axis_label = axlabels[xparam]
plot.yaxis.axis_label = axlabels[yparam1]
yrange1 = Range1d(start=yaxminima[yparam1],end=yaxmaxima[yparam1])
plot.y_range = yrange1
if (xparam != 'time') and (xparam != 'distance'):
xrange1 = Range1d(start=yaxminima[xparam],end=yaxmaxima[xparam])
plot.x_range = xrange1
if xparam == 'time':
xrange1 = Range1d(start=xaxmin,end=xaxmax)
plot.x_range = xrange1
plot.xaxis[0].formatter = DatetimeTickFormatter(
hours = ["%H"],
minutes = ["%M"],
seconds = ["%S"],
days = ["0"],
months = [""],
years = [""]
)
if yparam1 == 'pace':
plot.y_range = Range1d(ymin,ymax)
plot.yaxis[0].formatter = DatetimeTickFormatter(
seconds = ["%S"],
minutes = ["%M"]
)
if yparam2 != 'None':
yrange2 = Range1d(start=yaxminima[yparam2],end=yaxmaxima[yparam2])
plot.extra_y_ranges = {"yax2": yrange2}
plot.line('xvals','y2mean',color="black",y_range_name="yax2",
source=source2)
if plottype=='line':
plot.line('x1','y2',color="red",y_range_name="yax2",
legend=axlabels[yparam2],
source=source2)
elif plottype=='scatter':
# plot.circle(x1,y2,color="red",y_range_name="yax2",legend=yparam2,
# source=source,size=3)
plot.scatter('x1','y2',source=source2,legend=axlabels[yparam2]
,fill_alpha=0.4,
line_color=None,color="red",y_range_name="yax2")
plot.add_layout(LinearAxis(y_range_name="yax2",
axis_label=axlabels[yparam2]),'right')
hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([
('Time','@time'),
('Distance','@distance'),
('Pace','@pace'),
('HR','@hr'),
('SPM','@spmc{1.1}'),
('Power','@power{int}'),
])
hover.mode = 'mouse'
layout = layoutrow([layoutcolumn([slider_spm_min,
slider_spm_max,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -6,28 +6,17 @@
{% block content %}
{{ js_res | safe }}
{{ css_res| safe }}
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
<script type="text/javascript" src="/static/js/bokeh-widgets-0.12.3.min.js"></script>
<script async="true" type="text/javascript">
Bokeh.set_log_level("info");
</script>
{{ interactiveplot |safe }}
<script>
// Set things up to resize the plot on a window resize. You can play with
// the arguments of resize_width_height() to change the plot's behavior.
var plot_resize_setup = function () {
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
var plot = Bokeh.index[plotid];
var plotresizer = function() {
// arguments: use width, use height, maintain aspect ratio
plot.resize_width_height(true, false, false);
};
window.addEventListener('resize', plotresizer);
plotresizer();
};
window.addEventListener('load', plot_resize_setup);
</script>
<style>
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
html, body {height: 100%; margin:5px;}

View File

@@ -6,7 +6,7 @@
{% block content %}
<script type="text/javascript" src="/static/js/bokeh-0.11.1.min.js"></script>
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
<script async="true" type="text/javascript">
Bokeh.set_log_level("info");
</script>
@@ -59,7 +59,7 @@
<a class="button blue small alpha" href="/rowers/flexall/peakforce/{{ yparam1 }}/{{ yparam2 }}">Peak Force</a>
<a class="button blue small alpha" href="/rowers/flexall/averageforce/{{ yparam1 }}/{{ yparam2 }}">Average Force</a>
<a class="button blue small alpha" href="/rowers/flexall/drivelength/{{ yparam1 }}/{{ yparam2 }}">Drive Length</a>
<a class="button blue small alpha" href="/rowers/flexall/driveenergy/{{ yparam1 }}/{{ yparam2 }}">Drive Energy</a>
<a class="button blue small alpha" href="/rowers/flexall/driveenergy/{{ yparam1 }}/{{ yparam2 }}">Work per Stroke</a>
<a class="button blue small alpha" href="/rowers/flexall/drivespeed/{{ yparam1 }}/{{ yparam2 }}">Drive Speed</a>
{% else %}
<a class="button rosy small" href="/rowers/promembership">Power (Pro)</a>
@@ -68,7 +68,7 @@
<a class="button rosy small" href="/rowers/promembership">Peak Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Average Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Length (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Energy (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Work per Stroke (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Speed (Pro)</a>
{% endif %}
@@ -86,13 +86,13 @@
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/peakforce/{{ yparam2 }}">Peak Force</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/averageforce/{{ yparam2 }}">Average Force</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/drivelength/{{ yparam2 }}">Drive Length</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/driveenergy/{{ yparam2 }}">Drive Energy</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/driveenergy/{{ yparam2 }}">Work per Stroke</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/drivespeed/{{ yparam2 }}">Drive Speed</a>
{% else %}
<a class="button rosy small" href="/rowers/promembership">Peak Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Average Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Length (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Energy (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Work per Stroke (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Speed (Pro)</a>
{% endif %}
@@ -109,13 +109,13 @@
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/peakforce">Peak Force</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/averageforce">Average Force</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/drivelength">Drive Length</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/driveenergy">Drive Energy</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/driveenergy">Work per Stroke</a>
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/drivespeed">Drive Speed</a>
{% else %}
<a class="button rosy small" href="/rowers/promembership">Peak Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Average Force (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Length (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Energy (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Work per Stroke (Pro)</a>
<a class="button rosy small" href="/rowers/promembership">Drive Speed (Pro)</a>
{% endif %}

Some files were not shown because too many files have changed in this diff Show More