From 7f3fea5f37838a91d0d3b443897fa55d723d4003 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 1 Apr 2024 12:46:29 +0200 Subject: [PATCH] v1 instroke_compare --- rowers/interactiveplots.py | 99 +++++++++---------------- rowers/templates/instroke_analysis.html | 10 +-- 2 files changed, 38 insertions(+), 71 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 905e0fe3..ba018f19 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2756,12 +2756,14 @@ def forcecurve_multi_interactive_chart(selected): # pragma: no cover return (script, div) def instroke_multi_interactive_chart(selected, *args, **kwargs): # pragma: no cover - df_plot = pd.DataFrame() + df2 = [] ids = [analysis.id for analysis in selected] metrics = list(set([analysis.metric for analysis in selected])) maximum_values = {} + workouts = [] for metric in metrics: maximum_values[metric] = 0 + cntr = 1 for analysis in selected: #start_second, end_second, spm_min, spm_max, name activeminutesmin = int(analysis.start_second/60.) @@ -2781,79 +2783,48 @@ def instroke_multi_interactive_chart(selected, *args, **kwargs): # pragma: no co if mean_vals.max() > maximum_values[analysis.metric]: maximum_values[analysis.metric] = mean_vals.max() xvals = np.arange(len(mean_vals)) - xname = 'x_'+str(analysis.id) - yname = 'y_'+str(analysis.id) - df_plot[xname] = pd.Series(xvals) - df_plot[yname] = pd.Series(mean_vals) - if len(metrics) > 1: - for analysis in selected: - yname = 'y_'+str(analysis.id) - df_plot[yname] = df_plot[yname] / maximum_values[analysis.metric] + data2 = pd.DataFrame({ + 'x': pd.Series(xvals), + 'y': pd.Series(mean_vals), + + }) + data2['id'] = cntr + df2.append(data2) - source = ColumnDataSource( - df_plot - ) - - TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,crosshair' - plot = figure(width=920,tools=TOOLS, - toolbar_location='above', - toolbar_sticky=False) - - #plot.sizing_mode = 'stretch_both' - - # add watermark - watermarkurl = "/static/img/logo7.png" - - watermarkrange = Range1d(start=0, end=1) - watermarkalpha = 0.6 - watermarkx = 0.99 - watermarky = 0.01 - watermarkw = 184 - watermarkh = 35 - watermarkanchor = 'bottom_right' - plot.extra_y_ranges = {"watermark": watermarkrange} - plot.extra_x_ranges = {"watermark": watermarkrange} - - if len(metrics)>1: - plot.yaxis.axis_label = 'Scaled' - else: - plot.yaxis.axis_label = metrics[0] - - plot.image_url([watermarkurl], watermarkx, watermarky, - watermarkw, watermarkh, - global_alpha=watermarkalpha, - w_units='screen', - h_units='screen', - anchor=watermarkanchor, - dilate=True, - x_range_name="watermark", - y_range_name="watermark", - ) - - colors = itertools.cycle(palette) - - try: - items = itertools.izip(ids, colors) - except AttributeError: - items = zip(ids, colors) - - for id, color in items: - xname = 'x_'+str(id) - yname = 'y_'+str(id) - analysis = InStrokeAnalysis.objects.get(id=id) legendlabel = '{name} - {metric} - {workout}'.format( name = analysis.name, metric = analysis.metric, date = analysis.date, workout = str(analysis.workout) ) - plot.line(xname,yname,source=source,legend_label=legendlabel, - line_width=2, color=color) + workouts.append({'id': cntr, 'label': legendlabel}) + cntr = cntr + 1 - script, div = components(plot) + + ytitle = metrics[0] + if len(metrics) > 1: + cntr = 1 + for analysis in selected: + df2[cntr-1]['y'] = df2[cntr-1]['y'] / maximum_values[analysis.metric] + ytitle = 'Scaled' + cntr = cntr+1 - return (script, div) + df2 = pd.concat(df2, axis=0) + + data_dict = df2.to_dict("records") + + chart_data = { + 'title': '', + 'data': data_dict, + 'ytitle': ytitle, + 'workouts': workouts, + } + + script, div = get_chart("/instroke_compare", chart_data) + + return script, div + def instroke_interactive_chart(df,metric, workout, spm_min, spm_max, activeminutesmin, activeminutesmax, diff --git a/rowers/templates/instroke_analysis.html b/rowers/templates/instroke_analysis.html index 0ced8ffb..301e3ddb 100644 --- a/rowers/templates/instroke_analysis.html +++ b/rowers/templates/instroke_analysis.html @@ -6,24 +6,20 @@ {% block main %} -{{ js_res | safe }} -{{ css_res| safe }} - - - + -{{ the_script |safe }} -

In-Stroke Analysis for {{ rower.user.first_name }} {{ rower.user.last_name }}

    + {% if the_div %}
  • {{ the_div|safe }} + {{ the_script |safe }}
  • {% endif %}