Я только что присоединился к библиотеке 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))
Программа должна работать с копированием / вставкой ... ну без интерактивности ... Кто-нибудь, пожалуйста, помогите мне? Заранее большое спасибо.