私の質問はbokeh 0.7.1を使用してanother threadとかなり似ていますが、bokehサーバーのAPIは0.12.0で十分に変更されていますその答えを新しいバージョンに適応させる。要約すると、私は、継続的に更新されるファイルからデータを引き出すタイムストリームプロットのグリッドを持つページを持っています。このページには、ファイル内のすべての変数をリストするMultiSelectメニューがあります。私は、メニュー内の異なる変数を選択し、ボタンを押してから、既存の変数のプロットを消して、プロット数が異なる新しいタイムストリームに置き換えたいと思っています。スクリプトをbokeh serve --show script.py
ラッパーで実行しています。'bokeh serve'(bokeh 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()はbokehサーブには機能していないようです。 –
'loop_until_closed()'の使用法が今や落ちているように見えます:https://github.com/bokeh/bokeh/pull/7339 –