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

Bokeh自定义分类X轴:替换0-100数值刻度并修复点显示不全

解决Bokeh中数值X轴替换为自定义分类标签且保留所有数据点的问题

你遇到的问题其实是因为直接把x_range设为分类列表后,Bokeh会把X轴当成离散分类轴——只有当数据的x值正好是分类列表中的字符串时才会显示,而你的原始数据是0-100的数值,自然大部分点匹配不上,导致只显示零星的点。

要实现「数值范围0-100,刻度标签替换为自定义区间文本,同时保留所有数据点」的需求,正确的做法是保留数值轴,自定义刻度标签,具体方案如下:

方法一:使用FuncTickFormatter自定义刻度标签

这种方法最直接,不需要修改原始数据的x值,只需要替换数值轴的刻度显示文本,完美匹配你的需求:

完整代码示例

from bokeh.plotting import figure, show
from bokeh.models import FuncTickFormatter
import numpy as np

# 1. 生成示例数据(替换成你的真实数据即可)
x = np.random.uniform(0, 100, 50)  # 0-100的随机数值
y = np.random.normal(50, 10, 50)

# 2. 创建figure,保留原始数值X轴范围
p = figure(x_range=(0, 100), y_range=(20, 80), width=800, height=400, title="自定义X轴区间标签")

# 3. 绘制所有数据点(这里用circle,你可以换成自己需要的图形类型)
p.circle(x, y, size=10, color="#2c3e50", alpha=0.7)

# 4. 自定义X轴刻度标签:用JS函数判断数值所属区间并返回对应文本
p.xaxis.formatter = FuncTickFormatter(code="""
    const categories = ["item1", "item2", "item3", "item4", "item5"];
    // 计算当前刻度值对应的区间索引(每20为一个区间)
    const idx = Math.floor(tick / 20);
    // 确保索引不越界
    return categories[idx] || '';
""")

# 5. 手动设置刻度位置,让标签正好对应区间边界
p.xaxis.ticker = [0, 20, 40, 60, 80, 100]

# 显示图表
show(p)

为什么这个方法有效?

  • 我们保留了原始的数值X轴,数据点的x值还是0-100的数值,所以所有点都会正常显示在对应的位置。
  • 通过FuncTickFormatter编写一段JavaScript代码,把每个数值刻度转换成对应的分类文本,实现「数值位置不变,标签替换」的效果。
  • 手动设置ticker让刻度正好落在区间边界,确保标签和区间完全对应。

方法二:将数值映射为分类值(适合需要分类交互的场景)

如果你的场景需要分类轴的交互功能(比如点击分类筛选数据),可以把每个x数值映射到对应的分类,然后用FactorRange:

from bokeh.plotting import figure, show
from bokeh.models import FactorRange
import numpy as np

# 1. 生成数据并映射分类
x = np.random.uniform(0, 100, 50)
y = np.random.normal(50, 10, 50)
# 把每个x值映射到对应的分类
categorical = ["item1", "item2", "item3", "item4", "item5"]
x_categories = [categorical[min(int(x_val//20), 4)] for x_val in x]

# 2. 创建分类轴的figure
p = figure(x_range=categorical, y_range=(20, 80), width=800, height=400, title="分类轴聚合数据")

# 3. 绘制数据点:添加随机偏移避免同分类下的点重叠
p.circle(x_categories, y, size=10, color="#e74c3c", alpha=0.7, 
         x_offset=np.random.uniform(-10, 10, len(x)))

show(p)

注意事项

  • 这种方法下,所有数据点会被归类到对应的分类位置,如果你想保留原始数值的横向分布,方法一更合适;如果只需要按分类聚合展示,方法二更适用。

内容的提问来源于stack exchange,提问作者Claudiu Creanga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:33:18