From e7e97dfef3ee7e28c18b4ba2144e64e43ba01dc3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 8 Jul 2017 16:05:13 +0200 Subject: [PATCH 1/2] dot size multiflex --- rowers/interactiveplots.py | 11 +- rowers/views.py | 281 +++++++++++++------------------------ 2 files changed, 102 insertions(+), 190 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 6bbf023a..d81a6ece 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -73,14 +73,15 @@ def errorbar(fig, x, y, source=ColumnDataSource(), xerr=False, yerr=False, color='red', point_kwargs={}, error_kwargs={}): - fig.circle(x, y, source=source, name='data',color=color, **point_kwargs) + fig.circle(x, y, source=source, name='data',color=color, + **point_kwargs) xvalues = source.data[x] yvalues = source.data[y] xerrvalues = source.data['xerror'] yerrvalues = source.data['yerror'] - + try: a = xvalues[0]+1 @@ -1182,6 +1183,8 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', if groupby == 'workoutid': groupname = 'Workout' + elif groupby == 'date': + groupname = 'Date' else: groupname = axlabels[groupby] @@ -1264,7 +1267,7 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', point_kwargs={ 'line_color':None, 'legend':yparamname, - 'size':10, + 'size':"groupsize", }) if xparam == 'workoutid': @@ -1301,7 +1304,7 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', else: hover.tooltips = OrderedDict([ (groupby,'@groupval'), - ]) + ]) hover.mode = 'mouse' diff --git a/rowers/views.py b/rowers/views.py index 6c229c00..77cdfe0d 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3469,95 +3469,6 @@ def multiflex_view(request,userid=0, ids = [int(w.id) for w in workouts] request.session['ids'] = ids - fieldlist,fielddict = dataprep.getstatsfields() - fieldlist = [xparam,yparam,groupby, - 'workoutid','spm','driveenergy', - 'workoutstate'] - - # prepare data frame - datadf = dataprep.read_cols_df_sql(ids,fieldlist) - - datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) - - datadf = dataprep.filter_df(datadf,'spm',spmmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'spm',spmmax, - largerthan=False) - datadf = dataprep.filter_df(datadf,'driveenergy',workmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'driveneergy',workmax, - largerthan=False) - - datadf.dropna(axis=0,how='any',inplace=True) - datemapping = { - w.id:w.date for w in workouts - } - - datadf['date'] = datadf['workoutid'] - datadf['date'].replace(datemapping,inplace=True) - - today = datetime.date.today() - datadf['days ago'] = map(lambda x : x.days, datadf.date - today) - - if groupby != 'date': - bins = np.arange(datadf[groupby].min()-binsize, - datadf[groupby].max()+binsize, - binsize) - groups = datadf.groupby(pd.cut(datadf[groupby],bins,labels=False)) - else: - bins = np.arange(datadf['days ago'].min()-binsize, - datadf['days ago'].max()+binsize, - binsize, - ) - groups = datadf.groupby(pd.cut(datadf['days ago'], bins, - labels=False)) - - - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - - df = pd.DataFrame({ - xparam:xvalues, - yparam:yvalues, - 'xerror':xerror, - 'yerror':yerror, - }) - - if groupby != 'date': - try: - df['groupval'] = groups.mean()[groupby], - except ValueError: - df['groupval'] = groups.mean()[groupby].fillna(value=0) - else: - try: - df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] - except AttributeError: - df['groupval'] = groups.mean()['days ago'].fillna(value=0) - - if userid == 0: - extratitle = '' - else: - u = User.objects.get(id=userid) - extratitle = ' '+u.first_name+' '+u.last_name - - - - script,div = interactive_multiflex(df,xparam,yparam, - groupby, - extratitle=extratitle, - ploterrorbars=ploterrorbars) - - - - return render(request,'multiflex.html', - {'interactiveplot':script, - 'the_div':div, - 'chartform':chartform, - 'userid':userid, - 'teams':get_my_teams(request.user), - }) else: return HttpResponse("Form is not valid") elif request.method == 'POST' and 'ids' in request.session: @@ -3602,105 +3513,103 @@ def multiflex_view(request,userid=0, int(w.id): w.__unicode__() for w in workouts } - fieldlist,fielddict = dataprep.getstatsfields() - fieldlist = [xparam,yparam,groupby, - 'workoutid','spm','driveenergy', - 'workoutstate'] - - # prepare data frame - datadf = dataprep.read_cols_df_sql(ids,fieldlist) - - - datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) - - datadf = dataprep.filter_df(datadf,'spm',spmmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'spm',spmmax, - largerthan=False) - datadf = dataprep.filter_df(datadf,'driveenergy',workmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'driveneergy',workmax, - largerthan=False) - - datadf.dropna(axis=0,how='any',inplace=True) - - - datemapping = { - w.id:w.date for w in workouts - } - datadf['date'] = datadf['workoutid'] - datadf['date'].replace(datemapping,inplace=True) - today = datetime.date.today() - datadf['days ago'] = map(lambda x : x.days, datadf.date - today) - - if groupby != 'date': - bins = np.arange(datadf[groupby].min()-binsize, - datadf[groupby].max()+binsize, - binsize) - groups = datadf.groupby(pd.cut(datadf[groupby],bins, - labels=False)) - else: - bins = np.arange(datadf['days ago'].min()-binsize, - datadf['days ago'].max()+binsize, - binsize, - ) - groups = datadf.groupby(pd.cut(datadf['days ago'], bins, - labels=False)) - - - - - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - - df = pd.DataFrame({ - xparam:xvalues, - yparam:yvalues, - 'xerror':xerror, - 'yerror':yerror, - }) - - - if groupby == 'pace': - df['groupval'] = groups.mean()[groupby].fillna(value=0)/1000. - elif groupby != 'date': - try: - df['groupval'] = groups.mean()[groupby], - except ValueError: - df['groupval'] = groups.mean()[groupby].fillna(value=0) - else: - try: - df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] - except AttributeError: - df['groupval'] = groups.mean()['days ago'].fillna(value=0) - - - if userid == 0: - extratitle = '' - else: - u = User.objects.get(id=userid) - extratitle = ' '+u.first_name+' '+u.last_name - - - - script,div = interactive_multiflex(df,xparam,yparam, - groupby, - extratitle=extratitle, - ploterrorbars=ploterrorbars) - - - - return render(request,'multiflex.html', - {'interactiveplot':script, - 'the_div':div, - 'chartform':chartform, - 'userid':userid, - 'teams':get_my_teams(request.user), - }) else: return HttpResponse("invalid form") + + fieldlist,fielddict = dataprep.getstatsfields() + fieldlist = [xparam,yparam,groupby, + 'workoutid','spm','driveenergy', + 'workoutstate'] + + # prepare data frame + datadf = dataprep.read_cols_df_sql(ids,fieldlist) + + datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) + + datadf = dataprep.filter_df(datadf,'spm',spmmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'spm',spmmax, + largerthan=False) + datadf = dataprep.filter_df(datadf,'driveenergy',workmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'driveneergy',workmax, + largerthan=False) + + datadf.dropna(axis=0,how='any',inplace=True) + datemapping = { + w.id:w.date for w in workouts + } + + datadf['date'] = datadf['workoutid'] + datadf['date'].replace(datemapping,inplace=True) + + today = datetime.date.today() + datadf['days ago'] = map(lambda x : x.days, datadf.date - today) + + if groupby != 'date': + bins = np.arange(datadf[groupby].min()-binsize, + datadf[groupby].max()+binsize, + binsize) + groups = datadf.groupby(pd.cut(datadf[groupby],bins,labels=False)) + else: + bins = np.arange(datadf['days ago'].min()-binsize, + datadf['days ago'].max()+binsize, + binsize, + ) + groups = datadf.groupby(pd.cut(datadf['days ago'], bins, + labels=False)) + + + xvalues = groups.mean()[xparam] + yvalues = groups.mean()[yparam] + xerror = groups.std()[xparam] + yerror = groups.std()[yparam] + groupsize = groups.count()[xparam] + + #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, + 'xerror':xerror, + 'yerror':yerror, + 'groupsize':groupsize, + }) + + if groupby != 'date': + try: + df['groupval'] = groups.mean()[groupby], + except ValueError: + df['groupval'] = groups.mean()[groupby].fillna(value=0) + else: + try: + df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] + except AttributeError: + df['groupval'] = groups.mean()['days ago'].fillna(value=0) + + if userid == 0: + extratitle = '' + else: + u = User.objects.get(id=userid) + extratitle = ' '+u.first_name+' '+u.last_name + + + + script,div = interactive_multiflex(df,xparam,yparam, + groupby, + extratitle=extratitle, + ploterrorbars=ploterrorbars) + + + + return render(request,'multiflex.html', + {'interactiveplot':script, + 'the_div':div, + 'chartform':chartform, + 'userid':userid, + 'teams':get_my_teams(request.user), + }) else: url = reverse(user_multiflex_select) return HttpResponseRedirect(url) From b8e6817f18c42f0f938e934b7288828b60fd39d4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 8 Jul 2017 16:26:37 +0200 Subject: [PATCH 2/2] callouts on multiflex --- rowers/interactiveplots.py | 33 ++++--- rowers/views.py | 191 +++++++++++++++++++------------------ 2 files changed, 114 insertions(+), 110 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index d81a6ece..da082bd9 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1237,12 +1237,29 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', ) - TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,resize,hover' + TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,resize' + + if groupby != 'date': + hover = HoverTool(names=['data'], + tooltips = [ + (groupby,'@groupval{1.1}') + ]) + else: + hover = HoverTool(names=['data'], + tooltips = [ + (groupby,'@groupval') + ]) + + hover.mode = 'mouse' + TOOLS = [SaveTool(),PanTool(),BoxZoomTool(),WheelZoomTool(), + ResetTool(),TapTool(),ResizeTool(),hover] + plot = Figure(x_axis_type=x_axis_type,y_axis_type=y_axis_type, tools=TOOLS, toolbar_location="above", toolbar_sticky=False) + # add watermark plot.extra_y_ranges = {"watermark": watermarkrange} plot.extra_x_ranges = {"watermark": watermarkrange} @@ -1293,20 +1310,6 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', minutes = ["%M"] ) - hover = plot.select(dict(type=HoverTool)) - - - - if groupby != 'date': - hover.tooltips = OrderedDict([ - (groupby,'@groupval{1.1}'), - ]) - else: - hover.tooltips = OrderedDict([ - (groupby,'@groupval'), - ]) - - hover.mode = 'mouse' script,div = components(plot) diff --git a/rowers/views.py b/rowers/views.py index 77cdfe0d..40eab2e9 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3515,105 +3515,106 @@ def multiflex_view(request,userid=0, else: return HttpResponse("invalid form") - - fieldlist,fielddict = dataprep.getstatsfields() - fieldlist = [xparam,yparam,groupby, - 'workoutid','spm','driveenergy', - 'workoutstate'] - - # prepare data frame - datadf = dataprep.read_cols_df_sql(ids,fieldlist) - - datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) - - datadf = dataprep.filter_df(datadf,'spm',spmmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'spm',spmmax, - largerthan=False) - datadf = dataprep.filter_df(datadf,'driveenergy',workmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'driveneergy',workmax, - largerthan=False) - - datadf.dropna(axis=0,how='any',inplace=True) - datemapping = { - w.id:w.date for w in workouts - } - - datadf['date'] = datadf['workoutid'] - datadf['date'].replace(datemapping,inplace=True) - - today = datetime.date.today() - datadf['days ago'] = map(lambda x : x.days, datadf.date - today) - - if groupby != 'date': - bins = np.arange(datadf[groupby].min()-binsize, - datadf[groupby].max()+binsize, - binsize) - groups = datadf.groupby(pd.cut(datadf[groupby],bins,labels=False)) - else: - bins = np.arange(datadf['days ago'].min()-binsize, - datadf['days ago'].max()+binsize, - binsize, - ) - groups = datadf.groupby(pd.cut(datadf['days ago'], bins, - labels=False)) - - - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - groupsize = groups.count()[xparam] - - #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, - 'xerror':xerror, - 'yerror':yerror, - 'groupsize':groupsize, - }) - - if groupby != 'date': - try: - df['groupval'] = groups.mean()[groupby], - except ValueError: - df['groupval'] = groups.mean()[groupby].fillna(value=0) - else: - try: - df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] - except AttributeError: - df['groupval'] = groups.mean()['days ago'].fillna(value=0) - - if userid == 0: - extratitle = '' - else: - u = User.objects.get(id=userid) - extratitle = ' '+u.first_name+' '+u.last_name - - - - script,div = interactive_multiflex(df,xparam,yparam, - groupby, - extratitle=extratitle, - ploterrorbars=ploterrorbars) - - - - return render(request,'multiflex.html', - {'interactiveplot':script, - 'the_div':div, - 'chartform':chartform, - 'userid':userid, - 'teams':get_my_teams(request.user), - }) else: url = reverse(user_multiflex_select) return HttpResponseRedirect(url) + fieldlist,fielddict = dataprep.getstatsfields() + fieldlist = [xparam,yparam,groupby, + 'workoutid','spm','driveenergy', + 'workoutstate'] + + # prepare data frame + datadf = dataprep.read_cols_df_sql(ids,fieldlist) + + datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) + + datadf = dataprep.filter_df(datadf,'spm',spmmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'spm',spmmax, + largerthan=False) + datadf = dataprep.filter_df(datadf,'driveenergy',workmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'driveneergy',workmax, + largerthan=False) + + datadf.dropna(axis=0,how='any',inplace=True) + datemapping = { + w.id:w.date for w in workouts + } + + datadf['date'] = datadf['workoutid'] + datadf['date'].replace(datemapping,inplace=True) + + today = datetime.date.today() + datadf['days ago'] = map(lambda x : x.days, datadf.date - today) + + if groupby != 'date': + bins = np.arange(datadf[groupby].min()-binsize, + datadf[groupby].max()+binsize, + binsize) + groups = datadf.groupby(pd.cut(datadf[groupby],bins,labels=False)) + else: + bins = np.arange(datadf['days ago'].min()-binsize, + datadf['days ago'].max()+binsize, + binsize, + ) + groups = datadf.groupby(pd.cut(datadf['days ago'], bins, + labels=False)) + + + xvalues = groups.mean()[xparam] + yvalues = groups.mean()[yparam] + xerror = groups.std()[xparam] + yerror = groups.std()[yparam] + groupsize = groups.count()[xparam] + + #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, + 'xerror':xerror, + 'yerror':yerror, + 'groupsize':groupsize, + }) + + if groupby != 'date': + try: + df['groupval'] = groups.mean()[groupby], + except ValueError: + df['groupval'] = groups.mean()[groupby].fillna(value=0) + else: + try: + df['groupval'] = [x.strftime("%Y-%m-%d") for x in groups.min()[groupby]] + except AttributeError: + df['groupval'] = groups.mean()['days ago'].fillna(value=0) + + if userid == 0: + extratitle = '' + else: + u = User.objects.get(id=userid) + extratitle = ' '+u.first_name+' '+u.last_name + + + + script,div = interactive_multiflex(df,xparam,yparam, + groupby, + extratitle=extratitle, + ploterrorbars=ploterrorbars) + + + + return render(request,'multiflex.html', + {'interactiveplot':script, + 'the_div':div, + 'chartform':chartform, + 'userid':userid, + 'teams':get_my_teams(request.user), + }) + + # Box plots @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def user_boxplot_select(request,