diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index a1efd629..80e329df 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -628,7 +628,95 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): return [script,div,js_resources,css_resources] - +def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower'): + + power4min = [int(m.PowerFourMin) for m in fitnessmetrics] + power2k = [int(m.PowerTwoK) for m in fitnessmetrics] + power1hr = [int(m.PowerOneHour) for m in fitnessmetrics] + dates = [m.date for m in fitnessmetrics] + mode = [m.workoutmode for m in fitnessmetrics] + + df = pd.DataFrame( + {'power4min':power4min, + 'power2k':power2k, + 'power1hr':power1hr, + 'date':dates, + 'dates':dates, + 'mode':mode + }) + + + df = df[df['power2k']>0] + df = df[df['mode']==workoutmode] + + groups = df.groupby(by='date').max() + + power4min = groups['power4min'] + date = groups['dates'] + power2k = groups['power2k'] + power1hr = groups['power1hr'] + + source = ColumnDataSource( + data = dict( + power4min = power4min, + power2k = power2k, + date = date, + power1hr = power1hr + ) + ) + + TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair' + + plot = Figure(tools=TOOLS,toolbar_location="above", + toolbar_sticky=False,width=900, + x_axis_type='datetime') + +# plot.extra_y_ranges = {"watermark": watermarkrange} + +# plot.image_url([watermarkurl],1.8*max(thesecs),watermarky, +# watermarkw,watermarkh, +# global_alpha=watermarkalpha, +# w_units='screen', +# h_units='screen', +# anchor=watermarkanchor, +# dilate=True, +# y_range_name = "watermark", +# ) + + plot.circle('date','power2k',source=source,fill_color='red',size=7, + legend='2k power') + + plot.circle('date','power1hr',source=source,fill_color='blue',size=7, + legend='1 hr power') + + plot.circle('date','power4min',source=source,fill_color='green',size=7, + legend='4 min power') + + plot.xaxis.axis_label = 'Date' + plot.yaxis.axis_label = 'Power (W)' + + plot.xaxis.formatter = DatetimeTickFormatter( + days=["%d %B %Y"], + months=["%d %B %Y"], + years=["%d %B %Y"], + ) + + plot.xaxis.major_label_orientation = pi/4 + + plot.y_range = Range1d(0,1.5*max(power4min)) + plot.title.text = 'Fitness of '+user.first_name + + hover = plot.select(dict(type=HoverTool)) + + hover.tooltips = OrderedDict([ + ('Power 4 minutes','@power4min'), + ('Power 2000 m','@power2k'), + ('Power 1 hour','@power1hr'), + ]) + + script,div = components(plot) + + return [script,div] def interactive_histoall(theworkouts): TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair' diff --git a/rowers/templates/fitnessmetric.html b/rowers/templates/fitnessmetric.html new file mode 100644 index 00000000..8bc5b23d --- /dev/null +++ b/rowers/templates/fitnessmetric.html @@ -0,0 +1,114 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block title %}Rowsandall Fitness Progress {% endblock %} + +{% block content %} + + + + + + +{{ chartscript |safe }} + + + + + +