You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:37:21