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

关于Bokeh绘图extra_y_ranges的ipywidgets CustomJS回调格式求助

解决Bokeh extra_y_ranges 与 ipywidgets RangeSlider js_link的问题

错误原因

你之前的写法tps.extra_y_ranges('Speed')是Python字典的错误调用方式,Python字典的键访问需要用方括号[];但即使改成tps.extra_y_ranges['Speed'],在ipywidgets的js_link中直接通过绘图对象的字典属性引用Range对象也可能出现绑定问题,正确的做法是直接引用额外Y轴对应的Range1d对象。

正确实现步骤

  1. 提前定义并存储额外Y轴的Range对象
    在创建额外Y轴时,先把Range1d对象赋值给一个变量,再添加到extra_y_ranges中:

    from bokeh.models import Range1d, LinearAxis
    
    # 定义额外Y轴的范围对象
    speed_range = Range1d(start=Y2ndLLimit.value, end=Y2ndULimit.value)
    # 将该范围对象添加到绘图的extra_y_ranges中
    tps.extra_y_ranges['Speed'] = speed_range
    # 添加右侧的Y轴组件
    tps.add_layout(LinearAxis(y_range_name='Speed'), 'right')
    
  2. 使用Range对象直接绑定RangeSlider
    在创建ipywidgets的RangeSlider时,直接用上面定义的speed_range对象进行js_link绑定,而不是通过tps.extra_y_ranges访问:

    range_slider1 = RangeSlider(
        value=(Y2ndLLimit.value, Y2ndULimit.value),
        start=0, 
        end=4000, 
        step=.1, 
        title="Speed"
    )
    # 绑定滑块值的第一个元素到speed_range的start
    range_slider1.js_link("value", speed_range, "start", attr_selector=0)
    # 绑定滑块值的第二个元素到speed_range的end
    range_slider1.js_link("value", speed_range, "end", attr_selector=1)
    

补充说明

如果一定要通过绘图对象的extra_y_ranges来访问(不推荐),需要确保在Python中正确使用方括号[]访问,并且确认该Range对象已经被正确注册到绘图对象中,但直接引用变量的方式更可靠,也更符合代码可读性要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:30:59