如何通过回调获取DataRange1d对象的当前轴范围?
获取DataRange1d的当前轴范围(通过回调)
当然可以通过回调获取DataRange1d的当前轴范围,不管是自动缩放后的范围还是手动调整的范围,都能通过监听属性变化来获取,以下是两种常用场景的实现方式:
1. JavaScript回调(前端场景)
如果不需要后端交互,直接用CustomJS监听DataRange1d的start和end属性变化,就能实时拿到当前范围:
from bokeh.models import DataRange1d, CustomJS, ColumnDataSource from bokeh.plotting import figure, show source = ColumnDataSource(data=dict(x=[1,2,3,4,5], y=[2,4,6,8,10])) p = figure(x_range=DataRange1d()) p.line('x', 'y', source=source) # 定义JS回调函数,获取并处理当前轴范围 range_callback = CustomJS(args=dict(x_range=p.x_range), code=""" const currentStart = x_range.start; const currentEnd = x_range.end; console.log(`当前X轴范围:${currentStart} - ${currentEnd}`); // 若需将范围传递给其他组件,可写入数据源 // source.data = {range_start: [currentStart], range_end: [currentEnd]}; // source.change.emit(); """) # 绑定到start和end属性的变化事件 p.x_range.js_on_change('start', range_callback) p.x_range.js_on_change('end', range_callback) show(p)
当轴范围自动调整(比如数据更新后自动缩放)或手动拖拽调整时,回调会触发,直接读取x_range.start和x_range.end就能获取当前的实际范围。
2. Python回调(Bokeh Server场景)
如果使用Bokeh Server做后端交互,同样可以监听start和end的属性变化,在Python代码中获取范围:
from bokeh.models import DataRange1d, ColumnDataSource from bokeh.plotting import figure, curdoc from bokeh.layouts import column source = ColumnDataSource(data=dict(x=[1,2,3,4,5], y=[2,4,6,8,10])) p = figure(x_range=DataRange1d()) p.line('x', 'y', source=source) def on_range_change(attr, old_val, new_val): # 直接访问x_range的start和end属性 print(f"当前X轴范围:start={p.x_range.start}, end={p.x_range.end}") # 这里可根据范围执行后续逻辑,比如过滤数据、更新其他组件等 # 监听start和end的变化 p.x_range.on_change('start', on_range_change) p.x_range.on_change('end', on_range_change) curdoc().add_root(column(p))
启动Bokeh Server后,任何导致轴范围变化的操作(自动缩放、手动调整)都会触发回调,此时p.x_range.start和end就是当前的轴范围值。
内容的提问来源于stack exchange,提问作者user17647940
相关产品推荐
相关产品推荐

