From 2f75476cc3b2bafb842b27885f2b5672cf95fd4a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 9 Jul 2017 21:02:42 +0200 Subject: [PATCH] colorful multiflex --- rowers/forms.py | 6 +++--- rowers/interactiveplots.py | 38 +++++++++++++++++++++++++------------- rowers/views.py | 21 ++++++++++++++++++++- 3 files changed, 48 insertions(+), 17 deletions(-) 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..3d9bfa6b 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 @@ -1279,13 +1289,15 @@ 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, + 'legend':yparamname, + 'size':"groupsize", + 'fill_color':"color", + }, + ) if xparam == 'workoutid': plot.xaxis.axis_label = 'Workout' diff --git a/rowers/views.py b/rowers/views.py index 40eab2e9..5d2c0790 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: