Cumulative Flex Plot v1
This commit is contained in:
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.
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.
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.
BIN
cvkbrno/urls.pyc
BIN
cvkbrno/urls.pyc
Binary file not shown.
Binary file not shown.
76
move_db.py~
76
move_db.py~
@@ -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')
|
||||
@@ -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.
BIN
rowers/admin.pyc
BIN
rowers/admin.pyc
Binary file not shown.
BIN
rowers/apps.pyc
BIN
rowers/apps.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
rowers/email.pyc
BIN
rowers/email.pyc
Binary file not shown.
BIN
rowers/forms.pyc
BIN
rowers/forms.pyc
Binary file not shown.
@@ -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.
@@ -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.
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.
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.
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.
BIN
rowers/plots.pyc
BIN
rowers/plots.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
rowers/tasks.pyc
BIN
rowers/tasks.pyc
Binary file not shown.
@@ -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;}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user