Я пытаюсь использовать bokeh, чтобы показать какой-то интерактивный сюжет с CDSView, я хочу, чтобы x_range автоматически изменялся при изменении CDSView.filters и не менял источник. Однако x_range никогда не изменяется независимо от того, как я меняю фильтры, а x_range всегда сохраняет максимальный диапазон в зависимости от диапазона исходных данных.
Вот код ноутбука Jupyter ...
демонстрационная картинка
Большое спасибо!
from ipywidgets import widgets
from bokeh.io import output_notebook, show, push_notebook, output_file
from bokeh.plotting import figure
from bokeh.layouts import gridplot, column
from bokeh.models import ColumnDataSource, CDSView, IndexFilter
output_notebook()
periods = 500
x = np.linspace(0, 10, periods)
date = pd.date_range('20100101', periods=periods)
sin = np.sin(x) * x
cos = np.cos(x) * x
source = ColumnDataSource(dict(date=date, sin=sin, cos=cos))
view = CDSView(source=source, filters=[IndexFilter(list(range(100, 200)))])
f_sin = figure(plot_width=800, plot_height=200, x_axis_type='datetime')
f_sin.line(x='date', y='sin', view=view, source=source)
f_sin.xaxis[0].visible = False
f_cos = figure(plot_width=800, plot_height=200, x_range=f_sin.x_range, x_axis_type='datetime')
f_cos.line(x='date', y='cos', view=view, source=source)
grid = gridplot([[f_sin], [f_cos]], toolbar_location='right', plot_width=800, plot_height=200)
handle = show(grid, notebook_handle=True)
def update(idx=100):
idxes = list(range(max(idx-50, 0), idx+1))
view.filters = [IndexFilter(idxes)]
# f_sin.x_range.update(start=date[idxes[0]], end=date[idxes[-1]])
push_notebook()
slider = widgets.SelectionSlider(default=50, step=1, options=[(t.strftime('%Y-%m-%d'), i) for i, t in enumerate(date)])
play = widgets.Play(min=0, max=periods, step=1)
widgets.jslink((play, 'value'), (slider, 'index'))
widgets.interactive_output(update, dict(idx=slider))
display(widgets.HBox([play, slider]))