diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index a9e03c7d..e27a6105 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -19,7 +19,7 @@ from bokeh.models import ( GMapPlot, GMapOptions, ColumnDataSource, Circle, DataRange1d, PanTool, WheelZoomTool, BoxSelectTool, SaveTool, ResizeTool, ResetTool, TapTool,CrosshairTool,BoxZoomTool, - Span, + Span, Label ) #from bokeh.models.widgets import Slider, Select, TextInput from bokeh.core.properties import value @@ -696,6 +696,12 @@ def interactive_cum_flex_chart(theworkouts,promember=0, y_axis_type = 'datetime' y1mean = datadf.ix[:,'pseconds'].mean() + datadf['xname'] = xparam + datadf['yname1'] = yparam1 + if yparam2 != 'None': + datadf['yname2'] = yparam2 + else: + datadf['yname2'] = yparam1 source = ColumnDataSource( datadf @@ -723,12 +729,27 @@ def interactive_cum_flex_chart(theworkouts,promember=0, line_dash=[6,6],line_width=2) y2means = y1means + xlabel = Label(x=370,y=130,x_units='screen',y_units='screen', + text=xparam+": {x1mean:6.2f}".format(x1mean=x1mean), + background_fill_alpha=.7, + text_color='green', + ) + if (xparam != 'time') and (xparam != 'distance'): plot.add_layout(x1means) + plot.add_layout(xlabel) plot.add_layout(y1means) + y1label = Label(x=370,y=100,x_units='screen',y_units='screen', + text=yparam1+": {y1mean:6.2f}".format(y1mean=y1mean), + background_fill_alpha=.7, + text_color='blue', + ) + if yparam1 != 'time' and yparam1 != 'pace': + plot.add_layout(y1label) + y2label = y1label plot.circle('x1','y1',source=source2,fill_alpha=0.3,line_color=None, legend=yparamname1, ) @@ -780,6 +801,13 @@ def interactive_cum_flex_chart(theworkouts,promember=0, plot.add_layout(y2means) + y2label = Label(x=370,y=70,x_units='screen',y_units='screen', + text=yparam2+": {y2mean:6.2f}".format(y2mean=y2mean), + background_fill_alpha=.7, + text_color='red', + ) + if yparam2 != 'pace' and yparam2 != 'time': + plot.add_layout(y2label) hover = plot.select(dict(type=HoverTool)) @@ -797,6 +825,9 @@ def interactive_cum_flex_chart(theworkouts,promember=0, callback = CustomJS(args = dict(source=source,source2=source2, x1means=x1means, y1means=y1means, + y1label=y1label, + y2label=y2label, + xlabel=xlabel, y2means=y2means), code=""" var data = source.data var data2 = source2.data @@ -809,6 +840,9 @@ def interactive_cum_flex_chart(theworkouts,promember=0, var hr1 = data['hr'] var distance1 = data['distance'] var power1 = data['power'] + var xname = data['xname'][0] + var yname1 = data['yname1'][0] + var yname2 = data['yname2'][0] var minspm = minspm.value var maxspm = maxspm.value @@ -865,6 +899,9 @@ def interactive_cum_flex_chart(theworkouts,promember=0, x1means.location = xm y1means.location = ym1 y2means.location = ym2 + y1label.text = yname1+': '+ym1.toFixed(2) + y2label.text = yname2+': '+ym2.toFixed(2) + xlabel.text = xname+': '+xm.toFixed(2) source2.trigger('change'); """) @@ -1026,7 +1063,14 @@ def interactive_flex_chart2(id=0,promember=0, y_axis_type = 'datetime' y1mean = rowdata.ix[:,'pseconds'].mean() - + + rowdata['xname'] = xparam + rowdata['yname1'] = yparam1 + if yparam2 != 'None': + rowdata['yname2'] = yparam2 + else: + rowdata['yname2'] = yparam1 + # prepare data source = ColumnDataSource( rowdata @@ -1059,12 +1103,27 @@ def interactive_flex_chart2(id=0,promember=0, line_dash=[6,6],line_width=2) y2means = y1means + xlabel = Label(x=370,y=130,x_units='screen',y_units='screen', + text=xparam+": {x1mean:6.2f}".format(x1mean=x1mean), + background_fill_alpha=.7, + text_color='green', + ) + if (xparam != 'time') and (xparam != 'distance'): plot.add_layout(x1means) + plot.add_layout(xlabel) + plot.add_layout(y1means) - + y1label = Label(x=370,y=100,x_units='screen',y_units='screen', + text=yparam1+": {y1mean:6.2f}".format(y1mean=y1mean), + background_fill_alpha=.7, + text_color='blue', + ) + if yparam1 != 'time' and yparam1 != 'pace': + plot.add_layout(y1label) + y2label = y1label # average values if yparam1 == 'driveenergy': @@ -1132,6 +1191,13 @@ def interactive_flex_chart2(id=0,promember=0, plot.add_layout(y2means) + y2label = Label(x=370,y=70,x_units='screen',y_units='screen', + text=yparam2+": {y2mean:6.2f}".format(y2mean=y2mean), + background_fill_alpha=.7, + text_color='red', + ) + if yparam2 != 'pace' and yparam2 != 'time': + plot.add_layout(y2label) hover = plot.select(dict(type=HoverTool)) @@ -1150,6 +1216,9 @@ def interactive_flex_chart2(id=0,promember=0, callback = CustomJS(args = dict(source=source,source2=source2, x1means=x1means, y1means=y1means, + y1label=y1label, + y2label=y2label, + xlabel=xlabel, y2means=y2means), code=""" var data = source.data var data2 = source2.data @@ -1162,6 +1231,9 @@ def interactive_flex_chart2(id=0,promember=0, var hr1 = data['hr'] var distance1 = data['distance'] var power1 = data['power'] + var xname = data['xname'][0] + var yname1 = data['yname1'][0] + var yname2 = data['yname2'][0] var minspm = minspm.value var maxspm = maxspm.value @@ -1218,6 +1290,9 @@ def interactive_flex_chart2(id=0,promember=0, x1means.location = xm y1means.location = ym1 y2means.location = ym2 + y1label.text = yname1+': '+ym1.toFixed(2) + y2label.text = yname2+': '+ym2.toFixed(2) + xlabel.text = xname+': '+xm.toFixed(2) source2.trigger('change'); """)