如何定义Python Bokeh RangeSlaider.on_更改回调函数以更改绘图的IndexFilter?
我正在尝试为RangeSloider实现一个python回调函数。滑块值应该告诉IndexFilter应该获取哪个索引进行显示 例如:如果RangeSloider.value为(3,25),则我的绘图应仅包含/查看索引为3到25的数据如何定义Python Bokeh RangeSlaider.on_更改回调函数以更改绘图的IndexFilter?,python,bokeh,bokehjs,Python,Bokeh,Bokehjs,我正在尝试为RangeSloider实现一个python回调函数。滑块值应该告诉IndexFilter应该获取哪个索引进行显示 例如:如果RangeSloider.value为(3,25),则我的绘图应仅包含/查看索引为3到25的数据 from bokeh.io import output_file, show from bokeh.models import ColumnDataSource, GMapOptions, CustomJS, CDSView, IndexFilter from b
from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource, GMapOptions, CustomJS, CDSView, IndexFilter
from bokeh.plotting import gmap, ColumnDataSource, figure
from bokeh.layouts import column, row
from bokeh.models.widgets import RangeSlider
import numpy as np
def slider_callback(attr, old, new):
p.view = CDSView(source=source, filters=[IndexFilter(np.arange(new.value[0], new.value[1]))])
v.view = CDSView(source=source, filters=[IndexFilter(np.arange(new.value[0], new.value[1]))])
# data set
lon = [[48.7886, 48.7887, 48.7888, 48.7889, 48.789],
[48.7876, 48.7877, 48.78878, 48.7879, 48.787],
[48.7866, 48.7867, 48.7868, 48.7869, 48.786],
[48.7856, 48.7857, 48.7858, 48.7859, 48.785],
[48.7846, 48.7847, 48.7848, 48.7849, 48.784]]
lat = [[8.92, 8.921, 8.922, 8.923, 8.924],
[8.91, 8.911, 8.912, 8.913, 8.914],
[8.90, 8.901, 8.902, 8.903, 8.904],
[8.89, 8.891, 8.892, 8.893, 8.894],
[8.88, 8.881, 8.882, 8.883, 8.884]]
time = [0, 1, 2, 3, 4, 5]
velocity = [23, 24, 25, 24, 20]
lenght_dataset = len(lon)
# define source and map
source = ColumnDataSource(data = {'x': lon, 'y': lat, 't': time, 'v': velocity})
view = CDSView(source=source, filters=[IndexFilter(np.arange(0, lenght_dataset))])
map_options = GMapOptions(lat=48.7886, lng=8.92, map_type="satellite", zoom=13)
p = gmap("MY_API_KEY", map_options, title="Trajectory Map")
v = figure(plot_width=400, plot_height=400, title="Velocity")
# plot lines on map
p.multi_line('y', 'x', view=view, source=source, line_width=1)
v.line('t', 'v', view=view, source=source, line_width=3)
# slider to limit plotted data
range_slider = RangeSlider(title="Data Range Slider: ", start=0, end=lenght_dataset, value=(0, lenght_dataset), step=1)
range_slider.on_change('value', slider_callback)
# Layout to plot and output
layout = row(column(p, range_slider),
column(v)
)
output_file("diag_plot_bike_data.html")
show(layout)
一些注意事项:
比其他列的时间长-您将收到一条警告。在下面的代码中,我刚刚删除了它的最后一个元素时间
- 带有过滤器的
通常不应用于连续的字形,如线条(视图
,尤其是-v.line
)。你会收到一个关于它的警告。但是,如果multi_-line
中的索引始终是连续的,那么您就可以了。无论哪种方式,都可以使用段图示符来避免警告IndexFilter
- 在回调中,您试图在地物上设置视图-视图仅存在于glyph渲染器上
- 通常,您不希望重新创建视图,而是希望重新创建尽可能少的Bokeh模型。理想情况下,您只需更改过滤器的
字段。但是Bokeh中缺少一些接线,因此您必须设置视图的索引
字段,如下所示过滤器
- Python回调的
参数接收作为第一个参数传递给相应的new
调用的属性的新值。在本例中,它将是一个元组,因此您应该使用on\u change
而不是new[0]
new[0]
- 由于您已决定使用Python回调,因此不能再使用
和静态HTML文件-您必须使用show
curdoc()。UI需要Python代码在运行时的某个地方运行
- 更改滑块值时,您会注意到,
的各个分段将连接在一起-这是一个bug,我刚刚为它创建了一个multi_line
从bokeh.io导入curdoc
从bokeh.layouts导入列、行
从bokeh.models导入gmaptions、CDSView、IndexFilter
从bokeh.models.widgets导入范围滑块
从bokeh.plotting导入gmap,ColumnDataSource,图
lon=[[48.7886,48.7887,48.7888,48.7889,48.789],
[48.7876, 48.7877, 48.78878, 48.7879, 48.787],
[48.7866, 48.7867, 48.7868, 48.7869, 48.786],
[48.7856, 48.7857, 48.7858, 48.7859, 48.785],
[48.7846, 48.7847, 48.7848, 48.7849, 48.784]]
lat=[[8.92,8.921,8.922,8.923,8.924],
[8.91, 8.911, 8.912, 8.913, 8.914],
[8.90, 8.901, 8.902, 8.903, 8.904],
[8.89, 8.891, 8.892, 8.893, 8.894],
[8.88, 8.881, 8.882, 8.883, 8.884]]
时间=[0,1,2,3,4]
速度=[23,24,25,24,20]
长度数据集=长度(lon)
#定义源和映射
source=ColumnDataSource(数据={'x':lon,'y':lat,'t':时间,'v':速度})
视图=CDSView(源=源,过滤器=[IndexFilter(列表(范围(长度数据集)))]))
地图选项=GMapOptions(纬度=48.7886,液化天然气=8.92,地图类型=“卫星”,缩放=13)
p=gmap(“API\U键”,地图选项,标题=“轨迹地图”)
v=图形(绘图宽度=400,绘图高度=400,标题=“速度”)
p、 多行('y','x',视图=视图,源=源,线宽=1)
v、 线条('t','v',视图=视图,源=源,线条宽度=3)
范围滑块=范围滑块(title=“数据范围滑块:”,开始=0,结束=lenght\u数据集,值=(0,lenght\u数据集),步长=1)
def滑块_回调(属性、旧、新):
view.filters=[IndexFilter(列表(范围(*新)))]
范围\u滑块。在\u更改(“值”,滑块\u回调)
布局=行(列(p,范围\滑块),列(v))
curdoc().添加根目录(布局)
非常感谢!现在我明白了我做错了什么。这个bug很烦人。。。你知道像这样的事情通常需要多长时间才能解决吗?而且,我的gmap将不再有效,因为没有JS参与任何。但是关于这个问题,我将提出一个新的问题。不要担心gmap问题。我只是忘了输入我的google api密钥…:“你知道像这样的事情通常需要多长时间才能解决吗”-时间变化很大,我真的说不上来。好的,谢谢!这个bug破坏了我的工作。因为你对博克很在行:你知道有什么解决办法吗?有一些,但很麻烦。但事实上,这个问题已经被解决了。您可以通过以下方式从GitHub安装Bokeh,也可以等待一个月,等待下一个开发版本发布。