关于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对象。
正确实现步骤
提前定义并存储额外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')使用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
相关产品推荐
相关产品推荐

