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

如何让Bokeh的Y轴与HoverTool交互?解决显示异常及科学计数法问题

解决Bokeh HoverTool显示异常与Y轴科学计数法问题

嘿,我来帮你搞定这两个Bokeh的小问题!咱们一个个来拆解:

一、修复HoverTool显示“???”的问题

出现“???”基本都是因为HoverTool没正确关联到数据源里的字段,或者字段名称不匹配。你需要盯紧这几点:

  • 确保柱状图用的ColumnDataSource里,明确包含了Y轴数值对应的字段(比如叫device_count或者avg_devices)
  • HoverTool的tooltips里要精准引用这个字段,格式是@字段名,还可以加格式化规则(比如@字段名{0.00}来保留两位小数)
  • 记得把HoverTool添加到图表工具栏,要是有多个图层,最好指定关联的渲染器

举个直观的例子,如果数据源里有category(X轴分类)和avg_devices(Y轴数值),那tooltips应该这么写:

tooltips=[
    ("担忧类型", "@category"),
    ("平均设备数", "@avg_devices{0.1f}")  # 保留一位小数显示
]

二、关闭Y轴的科学计数法

要让Y轴显示普通数字而非带e的科学计数法,给Y轴加个格式化器就行,两种常用方式任你选:

方式1:用BasicTickFormatter直接关开关

最简单的方法,直接禁用科学计数法:

from bokeh.models import BasicTickFormatter

p.yaxis.formatter = BasicTickFormatter(use_scientific=False)

方式2:用NumeralTickFormatter自定义格式

如果需要更精细的显示(比如千分位、固定小数位数),可以用这个:

from bokeh.models import NumeralTickFormatter

# 示例:显示千分位整数
p.yaxis.formatter = NumeralTickFormatter(format="0,0")
# 或者:保留两位小数
# p.yaxis.formatter = NumeralTickFormatter(format="0.00")

完整修正代码示例

结合你的问题场景,我写了个可直接运行的完整代码,你可以替换成自己的真实数据:

from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource, HoverTool, BasicTickFormatter

# 模拟你的数据(替换成真实数据即可)
categories = [
    'The Loss of Privacy', 
    "We'll all lose touch with one another", 
    "We'll all be less safe", 
    "I have no fears about a more connected future"
]
avg_devices = [2, 3, 2, 4]  # 模拟的平均设备拥有量

# 创建数据源
source = ColumnDataSource(data=dict(
    category=categories,
    avg_devices=avg_devices
))

output_notebook()

# 创建图表
p = figure(
    x_range=categories, 
    height=350, 
    title="Privacy Fears vs. Device Ownership",
    x_axis_label="Fear Category",
    y_axis_label="Average Number of Devices Owned"
)

# 绘制柱状图并保存渲染器
vbar_renderer = p.vbar(
    x='category', 
    top='avg_devices', 
    width=0.9, 
    source=source,
    color='lightblue'
)

# 设置HoverTool
hover = HoverTool(
    renderers=[vbar_renderer],  # 指定关联的柱状图
    tooltips=[
        ("Fear Category", "@category"),
        ("Avg. Devices", "@avg_devices{0}")  # 整数格式显示
    ],
    mode='vline'  # 鼠标垂直悬停时触发提示
)
p.add_tools(hover)

# 关闭Y轴科学计数法
p.yaxis.formatter = BasicTickFormatter(use_scientific=False)

# 调整X轴标签角度,避免重叠
p.xaxis.major_label_orientation = 1.2

show(p)

最后再检查这几点

  1. 数据源里的字段名和vbar、HoverTool里引用的必须完全一致(大小写敏感!)
  2. 如果你的Y轴是整数,记得把格式化规则改成{0};是小数就调整成{0.00}这类
  3. 确保HoverTool已经通过add_tools()添加到图表里

内容的提问来源于stack exchange,提问作者Tom Slesinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:12:38