<p>实现它的一种方法是将<code>checkbox_group=checkbox_group, categories=categories</code>添加到<code>CustomJSFilter</code>回调中,以便它知道当前的类别选择。然后在<code>indices</code>上添加第二个过滤步骤,以最终返回回调中的<code>selected</code>数组(适用于Bokehv1.3.0)</p>
<pre><code>from bokeh.models import Slider, CustomJSFilter, CDSView, ColumnDataSource, CustomJS, CheckboxGroup, Column, Row
from bokeh.plotting import figure, show
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)
categories = ['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= categories, active = [0, 1, 2])
checkbox_group.js_on_change("active", CustomJS(code="source.change.emit();", args=dict(source=source)))
custom_filter = CustomJSFilter(args=dict(source=source, MinFlights=MinFlights, checkbox_group=checkbox_group, categories=categories), 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);}}
selected = []
for (i in indices) {
let selected_categories = checkbox_group.active.map((i) => categories[i])
console.log(selected_categories)
console.log(i, indices[i], source.data['Category'][i], selected_categories.includes(source.data['Category'][i]))
if(indices[i] && selected_categories.includes(source.data['Category'][i])) {
selected.push(true)
}
else {
selected.push(false)
}
}
return selected;
''')
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(Row(inputs, p))
</code></pre>
<p><a href="https://i.stack.imgur.com/c9iLG.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/c9iLG.gif" alt="enter image description here"/></a></p>