我的问题与使用散景0.7.1的another thread非常相似,但散景服务器的API在0.12.0中发生了足够的变化,我挣扎着以适应新版本的答案。总结一下,我有一个页面,其中包含一个时间流图的网格,它从一个不断更新的文件中提取数据。该页面有一个MultiSelect菜单,其中列出了我的文件中的所有变量。我希望能够在菜单中选择不同的变量,按下一个按钮,然后让现有变量的图消失并由新的时间流替换,其中图的数量可能不同。我正在使用bokeh serve --show script.py
包装器运行我的脚本。使用“散景服务”动态添加/删除绘图(散景0.12.0)
在我最初的尝试中,我给一个按钮分配了一个事件处理函数,它清除了'curdoc',然后为MultiSelect中新选择的变量添加了图。这会运行,但图的数量不会更新。显然,我错过了通知服务器以某种方式刷新页面布局的调用。
import numpy as np
from bokeh.driving import count
from bokeh.plotting import figure, curdoc
from bokeh.layouts import gridplot
from bokeh.models import Slider, Column, Row, ColumnDataSource, MultiSelect, Button
from netCDF4 import Dataset
import datetime
# data
#data = Dataset('/daq/spt3g_software/dfmux/bin/output.nc', 'r', format='NETCDF4')
data = Dataset('20160714_warm_overbiased_noise.nc', 'r', format='NETCDF4')
vars = data.variables.keys()[1:11]
# plots
d = {('y_%s'%name):[] for name in vars}
d['t'] = []
source = ColumnDataSource(data=d)
figs = [figure(x_axis_type="datetime", title=name) for name in vars]
plots = [f.line(x='t', y=('y_%s'%f.title.text), source=source, color="navy", line_width=1) for f in figs]
grid = gridplot(figs, ncols=3, plot_width=500, plot_height=250)
# UI definition
npoints = 2000
slider_npoints = Slider(title="# of points", value=npoints, start=1000, end=10000, step=1000.)
detector_select = MultiSelect(title="Timestreams:", value=[], options=vars)
update_detector_button = Button(label="update detectors", button_type="success")
# UI event handlers
def update_detector_handler():
global figs, plots, grid, source
d = {('y_%s'%name):[] for name in detector_select.value}
d['t'] = []
source = ColumnDataSource(data=d)
figs = [figure(x_axis_type="datetime", title=name) for name in detector_select.value]
plots = [f.line(x='t', y=('y_%s'%f.title.text), source=source, color="navy", line_width=1) for f in figs]
grid = gridplot(figs, ncols=3, plot_width=500, plot_height=250)
curdoc().clear()
curdoc().add_root(Column(Row(slider_npoints, Column(detector_select, update_detector_button)), grid))
update_detector_button.on_click(update_detector_handler)
# callback updater
@count()
def update(t):
data = Dataset('20160714_warm_overbiased_noise.nc', 'r', format='NETCDF4')
#data = Dataset('/daq/spt3g_software/dfmux/bin/output.nc', 'r', format='NETCDF4')
npoints = int(slider_npoints.value)
new_data = {('y_%s'%f.title.text):data[f.title.text][-npoints:] for f in figs}
new_data['t'] = data['Time'][-npoints:]*1e3
source.stream(new_data, npoints)
# define HTML layout and behavior
curdoc().add_root(Column(Row(slider_npoints, Column(detector_select, update_detector_button)), grid))
curdoc().add_periodic_callback(update, 500)
任何想法如何使这发生在服务器应用程序?一切都很清楚,但session.loop_until_closed()似乎不适用于散景服务。 –
现在看起来'loop_until_closed()'的用法现在不受欢迎:https://github.com/bokeh/bokeh/pull/7339 –