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
相关产品推荐
相关产品推荐

