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

如何从Python端指定Bokeh图表的第n个刻度(替代弃用的Coffeescript)

在Bokeh中从Python端传入参数控制每n个分类刻度显示

嘿,我来帮你搞定这个问题!既然Bokeh 2.0+已经弃用了CoffeeScript,咱们直接用Python结合CustomJS的方案就能实现需求——从Python端传递参数n,控制只显示每第n个分类刻度,全程不用写CoffeeScript代码。

下面是完整的可运行示例:

from bokeh.plotting import figure, show
from bokeh.models import CategoricalTickFormatter, CustomJS, ColumnDataSource

# 准备测试的分类数据(20个分类,方便看效果)
categories = [f"分类 {i}" for i in range(1, 21)]
values = list(range(1, 21))
source = ColumnDataSource(data=dict(x=categories, y=values))

# 这里就是你要从Python端传入的参数n——比如每3个刻度显示一个
n = 3

# 自定义分类刻度格式化器,把Python的n传递到JS逻辑里
custom_formatter = CategoricalTickFormatter(
    js_code=CustomJS(args=dict(n=n), code="""
        return function(ticks) {
            // 核心逻辑:只保留索引为n倍数的刻度标签,其他设为空
            return ticks.map((tick_label, index) => {
                return index % n === 0 ? tick_label : "";
            });
        }
    """)
)

# 创建图表并应用自定义格式化器
p = figure(
    x_range=categories,
    height=350,
    width=800,
    title=f"每{n}个分类刻度显示一次"
)
p.circle(x='x', y='y', source=source, size=12, color='#2ecc71')

# 把自定义格式化器绑定到x轴
p.xaxis.formatter = custom_formatter

show(p)

关键细节说明:

  • 参数传递:通过CustomJS的args参数,我们把Python变量n直接传给了JS代码,实现了Python到JS的参数传递
  • 刻度控制逻辑:JS里用map遍历所有刻度标签,判断索引是否是n的倍数,是就保留标签,否则设为空字符串(空字符串不会显示在图表上)
  • 灵活调整:如果想从第1个刻度开始计数(比如显示第3、6、9...个),可以把判断条件改成(index + 1) % n === 0,根据你的需求调整就行

如果需要更复杂的刻度定位(比如直接过滤掉不需要的刻度,而不是隐藏标签),也可以自定义TickLocator,但上面的方案已经能满足大部分场景的需求啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:56:59