如何将复选框勾选内容转换为对应pandas数据的Bokeh交互式绘图
Bokeh 自动绑定复选框与多列数据序列实现方案
核心逻辑是预生成所有数据序列的渲染对象,默认隐藏,通过复选框回调直接控制对应序列的可见性,无需手动为每个列写配置,完美适配数百列的场景。
完整实现代码
import pandas as pd from bokeh.models import CheckboxGroup, ColumnDataSource, Scroll from bokeh.plotting import figure from bokeh.layouts import column from bokeh.io import curdoc # ---------------------- 数据源配置 ---------------------- # 替换为你自己加载完成的DataFrame,需保证日期列已转为datetime类型 df = pd.read_csv("your_data.csv") df["date"] = pd.to_datetime(df["date"]) # 自动提取除日期列外的所有列作为可选数据序列 date_column = "date" data_columns = [col for col in df.columns if col != date_column] source = ColumnDataSource(df) # ---------------------- 绘图初始化 ---------------------- p = figure( x_axis_type="datetime", width=1200, height=600, title="多序列交互式趋势图" ) p.xaxis.axis_label = "日期" p.yaxis.axis_label = "数值" # ---------------------- 预生成所有数据序列 ---------------------- # 存储列名与对应渲染对象的映射 line_map = {} for col in data_columns: # 生成折线,默认隐藏 renderer = p.line( x=date_column, y=col, source=source, legend_label=col, line_width=2, visible=False ) line_map[col] = renderer # ---------------------- 复选框组件与回调绑定 ---------------------- # 自动用所有列名生成复选框选项,默认无选中 checkbox_group = CheckboxGroup(labels=data_columns, active=[]) # 状态变化回调:选中的序列设为可见,未选中的隐藏 def update_display(attr, old, new): for idx, col in enumerate(data_columns): line_map[col].visible = idx in new checkbox_group.on_change("active", update_display) # ---------------------- 页面布局与启动 ---------------------- # 复选框超过10个时建议加滚动容器,避免页面过长 scrollable_checkbox = Scroll(children=[checkbox_group], height=400, width=300) layout = column(scrollable_checkbox, p) curdoc().add_root(layout)
运行方式
将代码保存为app.py,在终端执行命令启动服务:
bokeh serve --show app.py
注意事项
- 日期列必须提前转换为
datetime类型,否则x轴无法正确识别为时间维度 - 300个序列预生成不会产生性能负担,默认隐藏状态下不会占用渲染资源
- 若需要自定义不同序列的颜色、线型等样式,可在循环生成折线时添加对应参数即可
内容的提问来源于stack exchange,提问作者Schlumpi
相关产品推荐
相关产品推荐

