Я создал параллельные графики, которые связывают воедино. Если щелкнуть точку данных на первом графике, строка, содержащая это значение на втором графике, будет выделена. Поскольку bokeh не имеет функциональных возможностей выделять только 1 выбранную полосу, я использовал решение для создания четырехугольного глифа другого цвета, который добавляется ко второму графику. Пример показан ниже. Datapoint щелкнул по графику bsps, чтобы создать выделенный глиф -> При щелчке по новому раскрывающемуся значению "Анкета" выделенный глиф остается
def callback(attr, old, new):
highlight_data = []
# changes month dropdown values based on questionnaire value
select_month.options = qm[q_select.value]
#changes patient dropdown values based on questionnaire chosen
p_select.options = opts[q_select.value]
# changes visualizations 1 and 2 data
sample_source.data = ColumnDataSource.from_df(scores.loc[(scores.record_id == p_select.value) & (scores.questionnaire == q_select.value)])
sample_missing_source.data=ColumnDataSource.from_df(miss.loc[(miss.record_id == p_select.value) & (miss.questionnaire == q_select.value)]) #set this ID equal to initial value of selector
if '.csv' in new:
highlight_data = []
select_month.value = str(0)
source_t.data = ColumnDataSource.from_df(total_df.loc[(total_df.questionnaire == q_select.value) & (total_df.month == 0)])
else:
source_t.data = ColumnDataSource.from_df(total_df.loc[(total_df.questionnaire == q_select.value) & (total_df.month == int(select_month.value))])
# plot visualization 1 based on new data
p.title.text='Patient: '+p_select.value+' Diagnosis: '+diagnosis[diagnosis['record_id']==p_select.value]['baseline_dsmiv'].to_string(index=False) + ' Questionnaire: '+q_select.value
legend_it=[]
score_vars=[var for var in np.unique(sample_source.data['variable'])]
missing_vars=[var for var in np.unique(sample_missing_source.data['variable'])]
def tap_callback(event):
highlight_data = []
selected = sample_missing_source.selected.indices
idx = selected[0]
row = {c: v[idx] for c, v in sample_missing_source.data.items()}
select_month.value = str(row['month'])
source_t.data = ColumnDataSource.from_df(total_df.loc[(total_df.questionnaire == row['questionnaire']) & (total_df.month == int(row['month']))])
p_t.title.text='Overall Patient Data for Questionnaire: '+ source_t.data['questionnaire'][0] + ", Month: " + str(source_t.data['month'][0])
p_t.x_range.end = int(source_t.data['total'][0]) + 1
highlight_data = ColumnDataSource.from_df(total_df.loc[(total_df.questionnaire == row['questionnaire']) & (total_df.month == int(row['month'])) & (total_df.number_questions_answered == int(row['completed']))])
try:
p_t.quad(top=int(highlight_data['participant_count']), bottom=0, left=float(highlight_data['number_questions_answered'])-0.5, right=float(highlight_data['number_questions_answered'])+0.5, color="#B3DE69")
except:
pass
q_select.on_change('value', callback)
p_select.on_change('value', callback)
select_month.on_change('value',callback)
p.on_event(Tap, tap_callback)
layout1 = column(p_select, q_select, p, digitized_copy)
layout2 = column(select_month, p_t)
curdoc().add_root(row(layout1,layout2))
Это работает для выделения панели на втором графике, в котором лежит точка данных, нажатая на первом графике. Однако, когда я выбираю другое значение «Анкеты» из выпадающего списка, четырехугольный глиф остается на втором графике. Я попытался установить highlight_data = [] для сброса источника данных четырехугольного глифа, но это не работает. Любые другие идеи о том, как очистить четырехугольный глиф, когда выбрано другое раскрывающееся значение «Анкета»?