
Hi,
I try to do the following: a simple setup where I can choose data from a MultiSelect: case1, case2 or case1+case2. If only one case is chosen (either case1 or case2) then the glyphs should be navy in color. If both cases are chosen, case1+case2, then case1 should be navy and the other case green.
I am using CDS for the data as I understand this is the most efficient way to update plots. However, I’m not able to loop over the cases in order to get correct legend entry and get correct colors if more than one case have been chosen. Any help appreciated. Thanks.
Kind regards,
Jonas
···
import pandas as pd
from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.models import CDSView, GroupFilter, ColumnDataSource
from bokeh.models.widgets import MultiSelect, Select
from bokeh.layouts import row, widgetbox
setup some data
data_df = pd.DataFrame()
x = range(1,6)
for i in range(1,3):
tmp_df = pd.DataFrame(x, columns = [‘x’])
tmp_df[‘y’] = tmp_df.x**i
tmp_df[‘case’] = ‘case’ + str(i)
data_df = data_df.append(tmp_df)
data_df[‘id’] = ‘A’
data_df.loc[data_df.x > 3, ‘id’] = ‘B’
print data_df
def plot_data():
plot = figure(plot_width = 300, plot_height = 300)
plot.min_border_left = 50
plot.title.text = id_select.value
colors = [ ‘navy’, ‘green’]
for i, case in enumerate(global_vals[‘cases’]):
print i, case
loop in order to set legends and line glyph correct - not working…
plot.line(x = ‘x’, y = ‘y’, color = colors[i], line_width = 2, legend = case, source = source)
r_circ = plot.circle(x = ‘x’, y = ‘y’, color = colors[i], size = 4, legend = case, source = source)
return plot
def update_cases():
case = multi_select.value
reset id selector
id = id_select.options[0]
id_select.value = id
df = data_df[(data_df.case.isin(case)) & (data_df.id == id) ]
print df
source.data = ColumnDataSource(df).data
global_vals[‘cases’] = case
print global_vals[‘cases’]
def update_id(attr, old, new):
case = multi_select.value
df = data_df[(data_df.case.isin(case)) & (data_df.id == new) ]
plot.title.text = id_select.value
source.data = ColumnDataSource(df).data
cases = data_df.case.unique().tolist()
id_list = data_df.id.unique().tolist()
source = ColumnDataSource(data_df)
global variable for cases
global_vals = dict( cases = cases)
selectors
multi_select = MultiSelect(
title = ‘Select case(s)’,
value = [str(cases[0])],
options = cases, size = 5)
id_select = Select(title = ‘ID’, value = id_list[0], options = id_list)
multi_select.on_change(‘value’, lambda attr, old, new: update_cases() )
id_select.on_change(‘value’, update_id)
Initial plot
update_cases()
plot = plot_data()
widgets = widgetbox([multi_select, id_select])
layout = row(widgets, plot)
curdoc().add_root(layout)
curdoc().title = “Plot”

