如何让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)
最后再检查这几点
- 数据源里的字段名和
vbar、HoverTool里引用的必须完全一致(大小写敏感!) - 如果你的Y轴是整数,记得把格式化规则改成
{0};是小数就调整成{0.00}这类 - 确保HoverTool已经通过
add_tools()添加到图表里
内容的提问来源于stack exchange,提问作者Tom Slesinger
相关产品推荐
相关产品推荐

