无需Python/JS回调,用Bokeh滑块实现数据动态筛选可行吗?
解决方案
完全可以通过Bokeh原生的CDSView、BooleanFilter结合Slider的js_link实现,无需Python回调或复杂自定义JS,导出的HTML可独立运行,不依赖Bokeh服务器。
以下是具体实现代码:
import numpy as np import pandas as pd from bokeh.io import show, save from bokeh.plotting import figure from bokeh.models import ColumnDataSource, Slider, BooleanFilter, CDSView, CustomJS from bokeh.layouts import column # 生成原始数据 x = np.arange(0, 10, 0.1) dfs = [] ts = range(100) for t in ts: y = x**(t/50.) dfs.append(pd.DataFrame({"x": x, "y": y, "t": t})) df = pd.concat(dfs) cds = ColumnDataSource(df) # 创建基础图表 p = figure(x_range=(0,10), y_range=(0,100)) scatter = p.scatter(x='x', y='y', source=cds) # 初始化布尔过滤器,默认显示t=0的数据 bool_filter = BooleanFilter(df['t'] == 0) scatter.view = CDSView(source=cds, filters=[bool_filter]) # 创建控制滑块 slider = Slider(start=0, end=99, value=0, step=1, title="t值") # 关联滑块与过滤器:通过js_link自动生成逻辑,实时更新过滤条件 slider.js_link('value', bool_filter, 'booleans', transform=CustomJS(args=dict(cds=cds), code=""" return cds.data['t'].map(t_val => t_val == this.value) """)) # 组合布局并展示/导出 layout = column(slider, p) show(layout) # save(layout, "bokeh_dynamic_filter.html") # 导出为独立HTML文件
核心逻辑说明
BooleanFilter通过布尔数组控制数据源中哪些数据点被渲染,初始状态只显示t=0的记录。js_link将滑块的value属性与过滤器的booleans属性关联,transform参数中的极简JS代码会根据当前滑块值,实时生成新的布尔数组,自动更新过滤结果。- 整个流程无需Python回调,所有交互逻辑在前端完成,导出的HTML文件可直接在浏览器打开使用。
内容的提问来源于stack exchange,提问作者Ben Farmer
相关产品推荐
相关产品推荐

