Как очистить глиф, добавленный к моему графику боке в обратном вызове, когда выбрано новое раскрывающееся значение? - PullRequest
0 голосов
/ 16 апреля 2020

Я создал параллельные графики, которые связывают воедино. Если щелкнуть точку данных на первом графике, строка, содержащая это значение на втором графике, будет выделена. Поскольку 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 = [] для сброса источника данных четырехугольного глифа, но это не работает. Любые другие идеи о том, как очистить четырехугольный глиф, когда выбрано другое раскрывающееся значение «Анкета»?

1 Ответ

0 голосов
/ 17 апреля 2020

Не звоните p_t.quad() в обратном вызове. Вызовите его один раз на верхнем уровне с пустым источником данных и просто обновите сам источник данных. Таким образом, если вы очистите источник данных, квад исчезнет.

Еще лучше, просто повторно используйте полный источник данных, который имеет все квады, и просто используйте фильтр: https://docs.bokeh.org/en/latest/docs/user_guide/data.html#filtering -data

...