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

Bokeh中如何使用TapTool点击点位展示原HoverTool的关联提示数据

实现方案

核心逻辑说明

你需要新增一个Div组件用来承载点位详情的展示内容,TapTool触发的回调只需要完成「读取选中点位索引→从数据源拉取对应数据→拼接为可视化内容更新到Div」三步即可,不需要复杂的JS逻辑。
Bokeh的CustomJS参数传递规则非常简单:你在args字典里传入的Python端Bokeh对象,在JS代码段中可以直接通过字典的key作为变量名访问。

完整修改代码

第一步:新增Div组件(加在绘图代码之前)

# 新增:创建信息展示容器
info_div = Div(width=1000, height=120, text="<b>点击任意点位查看详细数据</b>")

第二步:补全CustomJS回调代码

callback = CustomJS(args=dict(source=geo_source, div=info_div), code="""
// 获取选中的点位索引
const selected_indices = source.selected.indices;
if (selected_indices.length === 0) {
    div.text = "<b>点击任意点位查看详细数据</b>";
    return;
}
// 取第一个选中的点位(TapTool默认是单选模式)
const idx = selected_indices[0];
// 从数据源中提取对应点位的所有字段,可根据你的数据集增减字段
const data = source.data;
const content = `
<b>选中点位详情:</b><br>
经度:${data['Longitude'][idx].toFixed(4)}<br>
纬度:${data['Latitude'][idx].toFixed(4)}<br>
中位数收入:${data['MedInc'][idx].toFixed(2)}<br>
房屋均价:${data['price'][idx].toFixed(0)}美元<br>
平均房间数:${data['AveRooms'][idx].toFixed(1)}<br>
平均卧室数:${data['AveBedrms'][idx].toFixed(1)}<br>
区域人口:${data['Population'][idx].toFixed(0)}
`;
// 更新Div的展示内容
div.text = content;
"""
)

taptool = TapTool(callback=callback)
cal.add_tools(taptool)

第三步:组装布局并渲染

把原来单独渲染图表的逻辑替换为渲染包含图表和信息Div的布局:

# 组装布局
page_layout = layout([
    [cal],
    [info_div]
])

# 渲染展示
show(page_layout)

可选调整项

  • 如果需要支持多选展示多个点位信息,只需遍历selected_indices数组,把所有索引对应的数据都拼接到content字符串中即可
  • 可以自定义Div的样式、宽高,或者把Div放在图表的侧边,只需调整layout的布局参数即可

内容的提问来源于stack exchange,提问作者Mahdi tlemsani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:54:05