Я пытаюсь использовать Bokeh для создания интерактивного графика на основе списка, каждый элемент списка является DataFrame. Я хочу выбрать из выпадающего меню порядок df мне нужно построить.
У меня есть список с 2 DataFrame, и если я выберу OPTION1, я хочу построить из списка первый df. Если я выберу OPTION2, я хочу построить из списка 2-й df, индекс обоих будет DateTimeIndex ..... извините, это моя первая попытка использования Bokeh. Сюжет работает, первый раз, по умолчанию всегда строится 1-й, но он не обновляется, когда я выбираю новую ОПЦИЮ из выпадающего меню. Помощь в выявлении моей ошибки будет с благодарностью.
РЕДАКТИРОВАТЬ новый исходный код
import pickle
# https://stackoverflow.com/questions/58250387/bokeh-server-plot-not-updating-with-drop-down-menu-selection
from numpy.random import random
from bokeh.models import DatetimeTickFormatter, Slider, RangeTool
from bokeh.models.layouts import WidgetBox, Column, Row
from bokeh.plotting import ColumnDataSource, Figure, output_file, show, output_notebook
from bokeh.models.widgets import Select, TextInput
from bokeh.io import curdoc
from bokeh.palettes import Spectral11, Blues9, Oranges9
from bokeh.layouts import layout, row, column
from bokeh.plotting import figure
machines_produccion = [['LPOT101', 'PREN101', 'LPOT102', 'OTRO103', 'OTRO102', 'LPOT103'],
['TAGU004', 'LPOT005', 'LPOT003', 'LPOT002', 'TAGU003', 'TAGU005', 'LASE001', 'TAGU001', 'LPOT004', 'LPOT001',
'TAGU002']]
machines_aux = [['COAI109', 'COAI105', 'OTRO101', 'COAI108', 'COAI107', 'ALUM101', 'COAI104', 'COAI103', 'COAI106'],
['ALUM002', 'REFR001', 'COAI002', 'ALUM001', 'COAI001']]
LABELS_OPTION = ['OPTION1', 'OPTION2']
def get_dataset(src, idx):
df = src[idx].reset_index()
df.index.name = 'level_0'
return ColumnDataSource.from_df(data=df)
def make_plot(source, title):
TOOLS = 'crosshair,save,pan,box_zoom,reset,wheel_zoom,tap,hover'
plot = figure(plot_height=200, plot_width=600, title="NAIA4.0 PEAKS", toolbar_location=None, sizing_mode="scale_both", tools=TOOLS)#, x_range=('2018-07-05','2018-07-10'))
# plot = figure(x_axis_type="datetime", plot_width=800, tools="", toolbar_location=None)
plot.title.text = title
for machine, color in zip(machines_produccion[i], Spectral11):
plot.line(x='level_0', y=machine, source=source, line_color=color, line_width=1, legend='_' + machine,alpha=0.1)
for machine, color in zip(machines_aux[i], Spectral11):
plot.line(x='level_0', y=machine, source=source, line_color=color, line_width=2, line_dash="4 4", legend='_'+machine,alpha=0.1)
# fixed attributes
plot.legend.location = "top_right"
plot.legend.click_policy = "hide"
plot.xaxis.axis_label = 'datetime'
plot.xaxis[0].formatter = DatetimeTickFormatter()
plot.yaxis.axis_label = 'value(kW)'
return plot
def update_plot(attrname, old, new):
option_val = option_select.value
if option_val == 'OPTION1':
i=0
else:
i=1
plot.title.text = option_val
src = get_dataset(dfs, i)
source.data = src
i=0
option_select = Select(title="OPTIONS", value="OPTION1", options=LABELS_OPTION)
path_pickle = '../repo/processed/dfs_.pickle'
with open(path_pickle, 'rb') as f:
dfs = pickle.load(f)
df1 = dfs[i].reset_index()
df1.index.name = 'level_0'
source = ColumnDataSource(data = df1)
plot = make_plot(source, "TITLE")
option_select.on_change('value', update_plot)
controls = [option_select]
inputs = column(*controls, width=320, height=1000)
inputs.sizing_mode = 'fixed'
l = layout(row(inputs, plot), sizing_mode="scale_both")
curdoc().add_root(l)
Я не могу обновить график при выборе в раскрывающемся меню. Я печатаю «select_option», но сюжет не обновляется.