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

Bokeh DateRangeSlider自定义JS回调实现X轴范围调整求助

解决Bokeh DateRangeSlider调整X轴范围的CustomJS回调问题

我懂你现在的困扰——想用DateRangeSlider动态调整图表X轴的显示范围,但摸不透CustomJS怎么写,还没法调试排查问题是吧?别慌,我给你一步步解决,还会教你怎么在JS里打印值做调试!

核心问题分析

你之前的代码只触发了数据源的变化,但实际上你要调整的是图表X轴的显示范围,不是过滤数据源里的数据。所以我们需要在回调里直接操作图表的x_range对象,而不是只改动数据源。另外,浏览器的控制台是调试CustomJS的关键工具,这一点你之前没用到~

修改后的完整可运行代码

import numpy as np
import pandas as pd
from datetime import datetime
from bokeh.models import ColumnDataSource, DatetimeTickFormatter, HoverTool
from bokeh.models.widgets import DateRangeSlider
from bokeh.layouts import layout, column
from bokeh.models.callbacks import CustomJS
from bokeh.plotting import figure, output_file, show, save

datesX = pd.date_range(start='1/1/2018', periods=100)
valuesY = pd.DataFrame(np.random.randint(0,25,size=(100, 1)), columns=list('A'))
source = ColumnDataSource(data={'x': datesX, 'y': valuesY['A']})

# 输出到静态HTML文件
output_file('file.html')

hover = HoverTool(tooltips=[('Timestamp', '@x{%Y-%m-%d %H:%M:%S}'), ('Value', '@y')], formatters={'x': 'datetime'},)
date_range_slider = DateRangeSlider(title="Zeitrahmen", start=datesX[0], end=datesX[99], value=(datesX[0], datesX[99]), step=1, width=300)

# 创建图表
p = figure(title='file1', x_axis_label='Date', y_axis_label='yValue', x_axis_type='datetime', tools="pan, wheel_zoom, box_zoom, reset", plot_width=300, plot_height=200)

# 添加折线和hover工具
p.line(x='x', y='y', source=source, line_width=2)
p.add_tools(hover)

# 关键:修改回调函数,传入x_range并调整范围
callback = CustomJS(args=dict(x_range=p.x_range), code="""
    // 获取滑块的当前值(是一个包含起始和结束时间戳的数组)
    const [start_date, end_date] = cb_obj.value;
    
    // 设置X轴的显示范围
    x_range.start = start_date;
    x_range.end = end_date;
    
    // 调试用:打印值到浏览器控制台,方便排查问题
    console.log("滑块选中范围:", new Date(start_date), new Date(end_date));
    console.log("X轴当前范围:", new Date(x_range.start), new Date(x_range.end));
""")

date_range_slider.js_on_change('value', callback)

layout = column(p, date_range_slider)

# 保存并显示
save(layout)
show(layout)

关键部分拆解说明

  1. 回调参数传递:我们把图表的x_range对象传入了CustomJS,这样就能直接修改X轴的起始和结束值,这是实现范围调整的核心。
  2. 获取滑块值:cb_obj是触发回调的滑块本身,它的value属性是一个包含两个时间戳的数组,分别对应滑块的起始和结束选择值。
  3. 调试方法:用console.log()打印值,打开生成的file.html后按F12调出浏览器开发者工具,切换到「Console」标签,拖动滑块就能看到实时打印的日志,这能帮你快速排查逻辑问题。
  4. 无需修改数据源:因为你只是调整显示范围,不是过滤数据,所以不用改动source,直接修改x_range就足够了。

验证效果

运行代码后打开生成的HTML文件,拖动滑块就能看到X轴范围跟着实时变化,同时打开控制台能看到每次拖动的详细日志,完美解决你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:48:11