如何为Bokeh回调过滤器的一部分编写Javascript代码,以便我可以按数字和类别进行过滤?

如何为Bokeh回调过滤器的一部分编写Javascript代码,以便我可以按数字和类别进行过滤?,javascript,python,bokeh,Javascript,Python,Bokeh,我正在构建一个Bokeh可视化,并且一直在使用Javascript。我已经调整了一些JS代码以使用滑块,我还想通过复选框按类别另外过滤这些结果 我一直在尝试将我得到的(下面的简化版本)用于我在上面找到的其他代码,但在第一个JS for循环之后,我不知道如何扩展它。我会包括我一直在起草的东西,但坦率地说,这是一堆毫无意义的垃圾 from bokeh.models import Slider, CustomJSFilter, CDSView, ColumnDataSource, CustomJS f

我正在构建一个Bokeh可视化,并且一直在使用Javascript。我已经调整了一些JS代码以使用滑块,我还想通过复选框按类别另外过滤这些结果

我一直在尝试将我得到的(下面的简化版本)用于我在上面找到的其他代码,但在第一个JS for循环之后,我不知道如何扩展它。我会包括我一直在起草的东西,但坦率地说,这是一堆毫无意义的垃圾

from bokeh.models import Slider, CustomJSFilter, CDSView, ColumnDataSource, CustomJS
from bokeh.models.widgets import CheckboxGroup
from bokeh.layouts import column, layout

data = dict(Flights=[97, 34, 23, 6, 26, 97, 21, 92, 73, 10, 92, 14, 77, 4, 25, 48, 26, 39, 93],
            Not_Cancelled=[87, 63, 56, 38, 57, 63, 73, 56, 30, 23, 66, 47, 76, 15, 80, 78, 69, 87, 28],
            OnTime_Arrivals=[21, 65, 86, 39, 32, 62, 46, 51, 17, 79, 64, 43, 54, 50, 47, 63, 54, 84, 79],
            Category = ['A', 'B', 'B', 'C', 'A', 'C', 'B', 'C', 'C', 'B', 'A', 'A', 'B', 'B', 'A', 'C', 'C', 'C', 'C'])
source = ColumnDataSource(data=data)
Category_dict = dict(Cat = ['A','B','C'])
MinFlights = Slider(start=0, value=50, end=100, step=1)
MinFlights.js_on_change('value', CustomJS(args=dict(source=source), code="""
   source.change.emit()
"""))
checkbox_group = CheckboxGroup(labels= list(Category_dict["Cat"]), active = [1])
checkbox_group.js_on_change("active", CustomJS(code="source.change.emit();", args=dict(source=source)))

custom_filter = CustomJSFilter(args=dict(source=source, MinFlights=MinFlights), code='''
    var indices = [];
    for (var i = 0; i < source.get_length(); i++){
        if (source.data['Flights'][i] > MinFlights.value){
            indices.push(true);
        } else {
            indices.push(false);}}
    return indices;
''')
view = CDSView(source=source, filters=[custom_filter])

p = figure()
p.circle('OnTime_Arrivals', 'Not_Cancelled', source=source, view=view, size=20)

inputs = column(MinFlights, checkbox_group, width=200)
show(layout([[inputs,p]]))
来自bokeh.models导入滑块、CustomJSFilter、CDSView、ColumnDataSource、CustomJS
从bokeh.models.widgets导入CheckboxGroup
从bokeh.layouts导入列,布局
数据=dict(航班=[97,34,23,6,26,97,21,92,73,10,92,14,77,4,25,48,26,39,93],
未取消=[87,63,56,38,57,63,73,56,30,23,66,47,76,15,80,78,69,87,28],
到达时间=[21,65,86,39,32,62,46,51,17,79,64,43,54,50,47,63,54,84,79],
类别=[“A”、“B”、“B”、“C”、“A”、“C”、“B”、“C”、“B”、“A”、“A”、“B”、“B”、“B”、“A”、“C”、“C”、“C”、“C”])
源=列数据源(数据=数据)
类别dict=dict(类别=['A'、'B'、'C']
最小飞行次数=滑块(开始=0,值=50,结束=100,步骤=1)
MinFlights.js_on_change('value',CustomJS(args=dict(source=source),code=”“)
source.change.emit()
"""))
复选框组=复选框组(标签=列表(类别目录[“Cat”]),活动=[1])
复选框_group.js_on_change(“活动”,CustomJS(code=“source.change.emit();”,args=dict(source=source)))
自定义过滤器=自定义过滤器(args=dict(source=source,MinFlights=MinFlights),代码=“”
var指数=[];
对于(var i=0;iMinFlights.value){
指数推送(真);
}否则{
index.push(false);}
回报指数;
''')
视图=CDSView(源=源,过滤器=[自定义过滤器])
p=图()
p、 圆圈(‘按时到达’、‘未取消’、源=源、视图=视图、大小=20)
输入=列(最小飞行,复选框组,宽度=200)
显示(布局([[inputs,p]]))

有人能帮我吗?我所需要的只是一些代码来演示它是如何工作的,我可以修改其余的代码。

我不是博克专家,但在我看来,您的问题可以通过使用“布尔过滤器”来解决

优点:您可以使用booleanFilter编写python代码,不必担心JS

例如,我想要这样的东西:

import pandas as pd, numpy as np
from bokeh.models import BooleanFilter,ColumnDataSource,CDSView

df=pd.DataFrame(data)
df["bools"]=np.where((df.Flights > 10)&(df.Category=="A"),True,False)
view = CDSView(source=ColumnDataSource(df), filters=[BooleanFilter(bools)])

我不是博克专家,但在我看来,你的问题可以通过使用“布尔过滤器”来解决

优点:您可以使用booleanFilter编写python代码,不必担心JS

例如,我想要这样的东西:

import pandas as pd, numpy as np
from bokeh.models import BooleanFilter,ColumnDataSource,CDSView

df=pd.DataFrame(data)
df["bools"]=np.where((df.Flights > 10)&(df.Category=="A"),True,False)
view = CDSView(source=ColumnDataSource(df), filters=[BooleanFilter(bools)])

实现它的一种方法是将
checkbox\u group=checkbox\u group,categories=categories
添加到
CustomJSFilter
回调中,以便它知道当前的类别选择。然后在
索引
上添加第二个过滤步骤,以最终返回回调中所选的
数组(适用于Bokeh v 1.3.0)

从bokeh.models导入滑块、CustomJSFilter、CDSView、ColumnDataSource、CustomJS、CheckboxGroup、Column、Row
从bokeh.plotting导入图形,显示
数据=dict(航班=[97,34,23,6,26,97,21,92,73,10,92,14,77,4,25,48,26,39,93],
未取消=[87,63,56,38,57,63,73,56,30,23,66,47,76,15,80,78,69,87,28],
到达时间=[21,65,86,39,32,62,46,51,17,79,64,43,54,50,47,63,54,84,79],
类别=[“A”、“B”、“B”、“C”、“A”、“C”、“B”、“C”、“B”、“A”、“A”、“B”、“B”、“B”、“A”、“C”、“C”、“C”、“C”])
源=列数据源(数据=数据)
类别=['A'、'B'、'C']
最小飞行次数=滑块(开始=0,值=50,结束=100,步骤=1)
MinFlights.js_on_change('value',CustomJS(args=dict(source=source),code=”“)
source.change.emit()
"""))
复选框组=复选框组(标签=类别,活动=[0,1,2])
复选框_group.js_on_change(“活动”,CustomJS(code=“source.change.emit();”,args=dict(source=source)))
自定义过滤器=自定义过滤器(args=dict(source=source,MinFlights=MinFlights,checkbox\u group=checkbox\u group,categories=categories),代码=“”
var指数=[];
对于(var i=0;iMinFlights.value){
指数推送(真);
}否则{
index.push(false);}
选定=[]
(i)指数{
让选中的\u categories=checkbox\u group.active.map((i)=>categories[i])
console.log(选定的_类别)
console.log(i,索引[i],source.data['Category'][i],所选的_categories.includes(source.data['Category'][i]))
if(索引[i]&所选类别包括(源数据['Category'][i])){
选中。推送(true)
}
否则{
选中。推送(错误)
}
}
返回选中的;
''')
视图=CDSView(源=源,过滤器=[自定义过滤器])
p=图()
p、 圆圈(‘按时到达’、‘未取消’、源=源、视图=视图、大小=20)
输入=列(最小飞行,复选框组,宽度=200)
显示(行(输入,p))

实现此功能的一种方法是将
复选框组=复选框组,类别=类别
添加到您的
CustomJSFilter
回调中,以便它知道当前的类别选择。然后在
索引
上添加第二个过滤步骤,以最终返回回调中所选的
数组(适用于Bokeh v 1.3.0)

从bokeh.models导入滑块、CustomJSFilter、CDSView、ColumnDataSource、CustomJS、CheckboxGroup、Column、Row
从bokeh.plotting导入图形,显示
数据=dict(航班=[97,34,23,6,26,97,21,92,73,10,92,14,77,4,25,48,26,39,93],
未取消=[87,63,56,38,57,63,73,56,30,23,66,47,76,15,80,78,69,87,28],
到达时间=[21,65,86,