Я пытаюсь создать приборную панель, используя боке, и в настоящее время застрял на большом линейном графике, подобном этому:
Несмотря на то, что в моем блокноте Юпитера это довольно быстро (возможно, около секунды), на моем сервере bokeh это занимает вечность (несколько минут). вкладка сети в моей консоли отладки показывает, что за это время не было получено никаких новых данных, так что я думаю, это не может быть мой код Python, блокирующий рендеринг?
У меня также есть группа флажков, и снова требуется больше минуты, прежде чем обратный вызов даже достигнет сервера bokeh.
Я строю 40000+ линейных сегментов, связанных и перемежающихся с нагрузками значений NaN в 7 линиях. (Как я считаю, рисовать большие линии лучше, чем рисовать много линий в боке?).
Я строю свой сюжет так:
f = figure(toolbar_location=None, title='Schade verloop over leeftijd', output_backend="webgl")
f.xaxis.axis_label = 'Leeftijd'
f.yaxis.axis_label = 'Schade'
for i, col, lbl in zip(range(7), colors, labels):
r = f.line(x='x_line', y='y_line', line_width=2, source=sources[i], line_color=col, legend=lbl)
f.legend.location = "top_left"
f.legend.click_policy = "hide"
И небольшой подраздел моих данных:
xs = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,
np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192, 12.02739726, 13.25205479, 14.22739726,np.nan,np.nan,np.nan, 6.55616438, 7.53150685, 8.52054795,
9.47123288, 10.44109589,np.nan]),
np.array([np.nan,np.nan,np.nan, 0.70410959, 1.63835616,
2.73972603, 3.64931507,np.nan,np.nan,np.nan,np.nan, 4.00821918, 5.04383562, 6.00821918, 7.05479452,
np.nan,np.nan,np.nan,np.nan, 4.56164384,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,11.18082192,np.nan,np.nan,np.nan,np.nan,np.nan, 5.94794521, 6.55616438, 7.53150685, 8.52054795,
np.nan,np.nan,np.nan])]
ys = [np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]),
np.array([ np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
-0.15652901, 0.14953203, 0.62195036, 0.64414847, np.nan,
np.nan, np.nan, -0.33739475, -0.27092199, -0.32020045,
-0.35019554, -0.21857558, np.nan]),
np.array([ np.nan, np.nan, np.nan, -0.42062806, -0.50175937,
-0.39375614, -0.45259168, np.nan, np.nan, np.nan,
np.nan, -0.38755729, -0.45590074, -0.38985249, -0.30375873,
np.nan, np.nan, np.nan, np.nan, -0.10799712,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan, np.nan, np.nan,
-0.15652901, np.nan, np.nan, np.nan, np.nan,
np.nan, -0.2219407 , -0.33739475, -0.27092199, -0.32020045,
np.nan, np.nan, np.nan])]
который помещается в ColumnDataSource следующим образом:
single_sources = [ColumnDataSource({'x_line': xs[i], 'y_line': ys[i]}) for i in range(7)]
моя общая структура:
main.py:
tab1 = Lineplot_Tab()
tabs = Tabs(tabs=[tab1])
curdoc().add_root(tabs)
curdoc().title = 'Dos dashboard'
Lineplot_Tab.py
def Lineplot_tab():
# Some stuff with setting constants
# And loading some general data (pretty large I guess)
def make_full_dataset(checkboxselection):
# Loads sizable data based on the selection in the checkboxes,
# finally returns the ColumnDataSources
def make_plot(sources):
# The code for making the figure (as above)
def update():
plot_data_new, _, _ = make_full_dataset(checkbox_selection)
for i in range(7):
plot_data[i].data = plot_data_new[i].data
active = [0]
weg_selector = CheckboxGroup(labels=wegen, active=active)
weg_selector.on_change('active', update)
wegen_selectie = [wegen[i] for i in weg_selector.active]
plot_data, colors, labels = make_full_dataset(wegen_selectie)
p = make_plot(plot_data, colors, labels)
controls = WidgetBox(weg_selector)
layout = row(controls, p)
tab = Panel(child=layout, title='Schadeverloop')
return tab
Я использую сервер как:
bokeh serve --show --allow-websocket-origin=* --websocket-max-message-size=52428800000 dashboard
Надеюсь, кто-то увидит, что я делаю не так, я бы хотел использовать Bokeh для создания этой панели инструментов!