У меня есть Pandas DataFrame, похожий на этот:
person activities hours foodeaten
0 1 a 3 12
1 1 b 4 14
2 1 c 6 34
3 2 a 2 45
4 2 b 7 67
5 3 a 5 5
6 3 b 3 -1
7 3 c 2 3
8 3 d 12 5
Я хотел бы отразить часы, потраченные человеком на занятие, на занятие.итак, график 1: мероприятие а, где x = люди y = часы для мероприятия график 2: мероприятие b, где x = люди y = часы для мероприятия b и т. д.
Я хочу связать графики на основечеловек, не по указателю.Поэтому, когда я выбираю круг для человека 1 на графике 1, часы этого человека на других графиках также должны выделяться для моей цели.
MWE:
from bokeh.io import output_notebook, show, output_file, reset_output
from bokeh.plotting import figure
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource, CDSView, BooleanFilter
import pandas as pd
# data
data = {'person':[1,1,1,2,2,3,3,3,3],'activities':['a','b','c','a','b','a','b','c','d'], 'hours':[3,4,6,2,7,5,3,2,12],
'foodeaten':[12,14,34,45,67,5,-1,3,5]}
df = pd.DataFrame(data=data)
source = ColumnDataSource(data=df)
# filtering the data on activity
v1 = df.activities=='a'
v2 = df.activities=='b'
v3 = df.activities=='c'
v4 = df.activities=='d'
# creating a view to filter the source data on activity
view1 = CDSView(source=source, filters=[BooleanFilter(v1.values.tolist())])
view2 = CDSView(source=source, filters=[BooleanFilter(v2.values.tolist())])
view3 = CDSView(source=source, filters=[BooleanFilter(v3.values.tolist())])
view4 = CDSView(source=source, filters=[BooleanFilter(v4.values.tolist())])
# Plot options
tools = 'pan,box_select,lasso_select,help,poly_select,hover,wheel_zoom,reset'
plot_width = 300
plot_height = 300
TOOLTIPS = [("Person", "@person"),
("hours", "@hours"),]
plot_options = dict(plot_width=plot_width, plot_height=plot_height, tools =tools, tooltips= TOOLTIPS)
# plotting
p1 = figure(title ='activity a',**plot_options)
p1.circle('person', y='hours', size=15, view=view1, source=source)
plot_options['x_range']= p1.x_range
p2 = figure(title ='activity b',**plot_options)
p2.circle('person', y='hours', size=15, view=view2, source=source)
p3 = figure(title ='activity c',**plot_options)
p3.circle('person', y='hours', size=15, view=view3, source=source)
p4 = figure(title ='activity d',**plot_options)
p4.circle('person', y='hours', size=15, view=view4, source=source)
p12 = figure(title ='activity a',**plot_options)
p12.circle('person', y='foodeaten', size=15, view=view1, source=source)
plot_options['x_range']= p1.x_range
p22 = figure(title ='activity b',**plot_options)
p22.circle('person', y='foodeaten', size=15, view=view2, source=source)
p32 = figure(title ='activity c',**plot_options)
p32.circle('person', y='foodeaten', size=15, view=view3, source=source)
p42 = figure(title ='activity d',**plot_options)
p42.circle('person', y='foodeaten', size=15, view=view4, source=source)
p = gridplot([[p1,p12],[p2,p22],[p3,p32],[p4,p42]])
output_file('test.html')
show(p)
В этом примере показаносвязывать поведение по ряду, но я бы хотел выделить все для человека, выбрав атрибут этого человека на графике.