Линия сюжета Bokeh не обновляется после проверки CheckboxGroup в режиме сервера (python обратный вызов) - PullRequest
1 голос
/ 22 января 2020

Я только что присоединился к библиотеке Bokeh, и я хотел бы добавить интерактивность в мою панель. Для этого я хочу использовать виджет CheckboxGroup, чтобы выбрать, какой из столбцов pandas DataFrame будет отображаться.
Я следовал инструкциям, но, должно быть, неправильно понял использование ColumnDataSource, поскольку не могу заставить работать простой пример ...
Мне известны предыдущие вопросы по этому вопросу, и один из них, который представляется актуальным на форуме StackOverflow, является следующим: Bokeh не обновляет обновление линии сюжета из CheckboxGroup

К сожалению Мне не удалось воспроизвести правильное поведение.

Я попытался воспроизвести пример, следуя той же структуре обновления, представленной в График сервера Bokeh не обновляется должным образом, также он продолжает смещаться, и информация об оси исчезает от #bigreddot без успеха.

import numpy as np
import pandas as pd

from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.palettes import Spectral
from bokeh.layouts import row
from bokeh.models.widgets import CheckboxGroup
from bokeh.io import curdoc


#  UPDATE FUNCTION ------------------------------------------------
# make update function
def update(attr, old, new):
    feature_selected_test = [feature_checkbox.labels[i] for i in feature_checkbox.active]
    # add index to plot
    feature_selected_test.insert(0, 'index')
    # create new DataFrame
    new_df = dummy_df.filter(feature_selected_test)
    plot_src.data = ColumnDataSource.from_df(data=new_df)


# CREATE DATA SOURCE ------------------------------------------------
# create dummy data for debugging purpose
index = list(range(0, 890))
index.extend(list(range(2376, 3618)))
feature_1 = np.random.rand(len(index))
feature_2 = np.random.rand(len(index))
feature_3 = np.random.rand(len(index))
feature_4 = np.random.rand(len(index))

dummy_df = pd.DataFrame(dict(index=index, feature_1=feature_1, feature_2=feature_2, feature_3=feature_3,feature_4=feature_4))


# CREATE CONTROL ------------------------------------------------------
# list available data to plot
available_feature = list(dummy_df.columns[1:])
# initialize control
feature_checkbox = CheckboxGroup(labels=available_feature, active=[0, 1], name='checkbox')
feature_checkbox.on_change('active', update)


# INITIALIZE DASHBOARD ---------------------------------------------------
# initialize ColumnDataSource object
plot_src = ColumnDataSource(dummy_df)
# create figure
line_fig = figure()
feature_selected = [feature_checkbox.labels[i] for i in feature_checkbox.active]
# feature_selected = ['feature_1', 'feature_2', 'feature_3', 'feature_4']

for index_int, col_name_str in enumerate(feature_selected):
    line_fig.line(x='index', y=col_name_str, line_width=2, color=Spectral[11][index_int % 11], source=plot_src)


curdoc().add_root(row(feature_checkbox, line_fig))

Программа должна работать с копированием / вставкой ... ну без интерактивности ... Кто-нибудь, пожалуйста, помогите мне? Заранее большое спасибо.

1 Ответ

1 голос
/ 22 января 2020

Вы добавляете глифы только для начального подмножества выбранных функций:

for index_int, col_name_str in enumerate(feature_selected):
    line_fig.line(x='index', y=col_name_str, line_width=2, color=Spectral[11][index_int % 11], source=plot_src)

Так что это все, что когда-либо будет показано.

Добавление новых столбцов в CDS автоматически не приводит к каким-либо конкретным событиям, это просто дополнительные данные, которые могут быть использованы глифами или инструментами для наведения курсора для потенциального использования. Чтобы действительно показать это, должны быть глифы, настроенные для отображения этих столбцов. Вы можете сделать это, динамически добавлять и удалять глифы, но было бы гораздо проще просто все добавить сразу и использовать флажок, чтобы переключать только видимость . Вот пример этого в репо:

https://github.com/bokeh/bokeh/blob/master/examples/app/line_on_off.py

В этом примере данные передаются в виде литералов в функцию глифа, но вы можете поместить все данные в CDS тоже впереди.

...