我正在尝试使用bokeh构建仪表板,并且目前卡在这样的大线条图中:
即使这在我的木星笔记本中绘制得相当快(大约一秒钟),但在我的bokeh服务器中却要花很长时间(几分钟)。调试控制台中的“网络”选项卡显示在此期间未接收到新数据,因此我想那可能不是我的python代码阻止了渲染吗?
我还有一个复选框组,而且回调甚至需要超过一分钟的时间才能到达bokeh服务器。
我正在绘制40,000+条线段,这些线段在7条线中连接并散布着NaN值的负载。 (因为我相信在散景中绘制大线条比绘制多条线条更好?)。
我的情节是这样的:
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来构建此仪表板!
答案 0 :(得分:1)
我知道了,所以对于以后找到它的任何人:
大量连续的NaN值实际上是一个问题(我猜想是如何绘制图的)。我使用了一个熊猫数据框上的过滤器创建了我的数据集,然后将其转换为一个numpy数组,并在后面加上了NaN以创建单独的行。 为了减少NaN的数量,我只是将Pandas中不包含有用值的行删除了。
vals = vals.dropna(axis=0,how='all')
虽然这不会删除所有行上所有连续的NaN值,但它显着减少了数量,并极大地缩短了渲染时间。 (从几分钟到一秒左右)
我意识到这对我来说是一个非常具体的解决方案,但是无论哪种方式,NaN都在将相应的DO绘制为数据点!
有趣的是,这不是jupyter笔记本中的问题。