用按钮迭代到 Bokeh 图中的某个值

Iterate with a button to a certain value in the Bokeh graph

下面的代码创建了下面的图表

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
from bokeh.models import Button, CustomJS
from bokeh.layouts import row
from random import random

p = figure(x_range=(0, 10))
p.line(list(range(1000)), [random() for _ in range(1000)])

b = Button(label='Show next 10', callback=CustomJS(args=dict(xr=p.x_range), 
code="""
 xr.start = xr.end;
 xr.end = xr.end + 10;
"""))

我怎样才能让它显示从 y 轴到当前位置的下一个“0.5”值而不是在图表上显示下一个值

我用 choice 替换了 random 因为在随机浮点值数组中找到特定值几乎总是 return 没有。

此代码以这样一种方式滚动当前视口,以便下一个合适的值恰好位于中间。当没有这个值时,按下按钮不会做任何事情。

请注意,所有关于 "next values" 的讨论都意味着 x 轴的数据在任何一步都不会减少。

from bokeh.plotting import figure
from bokeh.models import Button, CustomJS, ColumnDataSource
from random import choice

p = figure(x_range=(0, 10))
ds = ColumnDataSource(data=dict(x=list(range(1000)),
                                y=[choice([1, 2, 3, 4, 5]) for _ in range(1000)]))
p.line(x='x', y='y', source=ds)

TARGET_Y = 2

b = Button(label='Show next {}'.format(TARGET_Y),
           callback=CustomJS(args=dict(ds=ds, xr=p.x_range),
                             code="""
    const half_span = (xr.end - xr.start) / 2;
    const mid = xr.start + half_span;
    const ys = ds.data['y'];
    const new_mid = ds.data['x'].find((x, idx) => x > mid && ys[idx] === %s);
    if (new_mid !== undefined) {
        xr.start = new_mid - half_span;
        xr.end = new_mid + half_span;
    }
""" % TARGET_Y))