diff --git a/rowers/forms.py b/rowers/forms.py index 95ee6b02..412087b1 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -330,12 +330,12 @@ parchoicesmultiflex = list(sorted(formaxlabelsmultiflex.items(), key = lambda x: class MultiFlexChoiceForm(forms.Form): xparam = forms.ChoiceField(choices=parchoicesmultiflex, - initial='spm', + initial='hr', label='X axis') yparam = forms.ChoiceField(choices=parchoicesmultiflex, - initial='power', + initial='pace', label='Y axis') - groupby = forms.ChoiceField(choices=groupchoices,initial='date', + groupby = forms.ChoiceField(choices=groupchoices,initial='spm', label='Group By') binsize = forms.FloatField(initial=1,required=False,label = 'Bin Size') spmmin = forms.FloatField(initial=15, diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index da082bd9..47d446cd 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -81,17 +81,24 @@ def errorbar(fig, x, y, source=ColumnDataSource(), xerrvalues = source.data['xerror'] yerrvalues = source.data['yerror'] - - + try: + colorvalues = source.data['color'] + except KeyError: + colorvalues = ["#%02x%02x%02x" % (255,0,0) for x in xvalues] + + try: a = xvalues[0]+1 if xerr: x_err_x = [] x_err_y = [] - for px, py, err in zip(xvalues, yvalues, xerrvalues): + err_color = [] + for px, py, err, color in zip(xvalues, yvalues, xerrvalues, colorvalues): x_err_x.append((px - err, px + err)) x_err_y.append((py, py)) - fig.multi_line(x_err_x, x_err_y, color=color, + err_color.append(color) + + fig.multi_line(x_err_x, x_err_y, color=err_color, name='xerr', **error_kwargs) except TypeError: @@ -102,10 +109,13 @@ def errorbar(fig, x, y, source=ColumnDataSource(), if yerr: y_err_x = [] y_err_y = [] - for px, py, err in zip(xvalues, yvalues, yerrvalues): + err_color = [] + for px, py, err, color in zip(xvalues, yvalues, yerrvalues, colorvalues): y_err_x.append((px, px)) y_err_y.append((py - err, py + err)) - fig.multi_line(y_err_x, y_err_y, color=color, + err_color.append(color) + + fig.multi_line(y_err_x, y_err_y, color=err_color, name='yerr',**error_kwargs) except TypeError: pass @@ -1166,7 +1176,7 @@ def interactive_chart(id=0,promember=0): def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', ploterrorbars=False, - title=None): + title=None,binsize=1): if datadf.empty: return ['','

No non-zero data in selection

'] @@ -1279,13 +1289,14 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', ) errorbar(plot,xparam,yparam,source=source, - xerr=ploterrorbars, - yerr=ploterrorbars, - point_kwargs={ - 'line_color':None, - 'legend':yparamname, - 'size':"groupsize", - }) + xerr=ploterrorbars, + yerr=ploterrorbars, + point_kwargs={ + 'line_color':None, + 'size':"groupsize", + 'fill_color':"color", + }, + ) if xparam == 'workoutid': plot.xaxis.axis_label = 'Workout' @@ -1297,6 +1308,15 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', else: plot.yaxis.axis_label = axlabels[yparam] + binlabel = Label(x=100,y=100,x_units='screen', + y_units='screen', + text="Bin size {binsize:3.1f}".format(binsize=binsize), + background_fill_alpha=0.7, + background_fill_color='white', + text_color='black', + ) + + plot.add_layout(binlabel) yrange1 = Range1d(start=yaxmin,end=yaxmax) plot.y_range = yrange1 diff --git a/rowers/views.py b/rowers/views.py index 40eab2e9..c0e1d69f 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1,4 +1,5 @@ import time +import colorsys import timestring import zipfile import bleach @@ -3571,7 +3572,8 @@ def multiflex_view(request,userid=0, #groupsize = 15.*np.log10(1+99.*groupsize/float(max(groupsize))) groupsize = 30.*np.sqrt(groupsize/float(max(groupsize))) - + + df = pd.DataFrame({ xparam:xvalues, yparam:yvalues, @@ -3579,18 +3581,35 @@ def multiflex_view(request,userid=0, 'yerror':yerror, 'groupsize':groupsize, }) + + aantal = len(df) if groupby != 'date': try: df['groupval'] = groups.mean()[groupby], + groupcols = df['groupval'] except ValueError: df['groupval'] = groups.mean()[groupby].fillna(value=0) + groupcols = df['groupval'] else: try: df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] + groupcols = 100.*np.arange(aantal)/float(aantal) except AttributeError: df['groupval'] = groups.mean()['days ago'].fillna(value=0) + groupcols = 100.*np.arange(aantal)/float(aantal) + + groupcols = (groupcols-groupcols.min())/(groupcols.max()-groupcols.min()) + if aantal == 1: + groupcols = np.array([1.]) + + groupcols *= 100. + rgb = [colorsys.hsv_to_rgb(float(x/100.), 1.0, 1.0) for x in groupcols] + RGB = [(int(255.*r),int(255.*g),int(255.*b)) for (r, g, b) in rgb] + colors = ["#%02x%02x%02x" % (r, g, b) for (r, g, b) in RGB] + df['color'] = colors + if userid == 0: extratitle = '' else: @@ -3602,7 +3621,8 @@ def multiflex_view(request,userid=0, script,div = interactive_multiflex(df,xparam,yparam, groupby, extratitle=extratitle, - ploterrorbars=ploterrorbars) + ploterrorbars=ploterrorbars, + binsize=binsize)