Javascript Bokeh拨动套索/悬停
我在bokeh有一个套索和一个悬停工具,每个工具都有一个类似的回调来与二次绘图交互(悬停将显示与单个数据点相关的元数据,而套索将显示跨点平均的相同元数据) 回调分别对hover和lasso起作用,但当两者都处于活动状态时,hover起主导作用。我想做的是,用户可以选择套索或悬停,但不能同时选择两者 有没有一种方法可以在活动工具更改时触发回调,最好是在CustomJS中,这样我就不必运行bokeh服务器了 下面是一些示例代码和输出Javascript Bokeh拨动套索/悬停,javascript,python,html,callback,bokeh,Javascript,Python,Html,Callback,Bokeh,我在bokeh有一个套索和一个悬停工具,每个工具都有一个类似的回调来与二次绘图交互(悬停将显示与单个数据点相关的元数据,而套索将显示跨点平均的相同元数据) 回调分别对hover和lasso起作用,但当两者都处于活动状态时,hover起主导作用。我想做的是,用户可以选择套索或悬停,但不能同时选择两者 有没有一种方法可以在活动工具更改时触发回调,最好是在CustomJS中,这样我就不必运行bokeh服务器了 下面是一些示例代码和输出 from bokeh.io import output_file
from bokeh.io import output_file
from bokeh.layouts import row
from bokeh.plotting import figure, show
from bokeh.models import (
ColumnDataSource, CustomJS,
HoverTool, LassoSelectTool)
output_file('toggle_lasso_hover.html')
s1 = ColumnDataSource({
'x': [0, 1, 2],
'y': [1, 1, 1]
})
s2 = ColumnDataSource({
'x': [],
'y': []
})
js_args = {'s1': s1, 's2': s2}
js_code = """
var d1 = s1.data;
var d2 = {'x': [], 'y': []};
for (i=0; i < inds.length; i++) {
j = inds[i];
d2['x'].push(d1['x'][j]);
d2['y'].push(d1['y'][j]);
}
s2.data = d2;
s2.change.emit();
"""
on_hover = CustomJS(args=js_args, code="""
var inds = cb_data.index['1d'].indices;
%s
""" % js_code)
on_lasso = CustomJS(args=js_args, code="""
var inds = cb_obj.selected['1d'].indices;
%s
""" % js_code)
p1 = figure(
width=300, height=300, tools="reset", active_drag=None)
p1.circle('x', 'y', source=s1, size=20, color='blue')
# define tools
hover = HoverTool(tooltips=None, callback=on_hover)
lasso = LassoSelectTool()
p1.add_tools(hover)
p1.add_tools(lasso)
s1.callback = on_lasso
p2 = figure(
width=300, height=300, x_range=p1.x_range, y_range=p1.y_range,
toolbar_location=None)
p2.circle('x', 'y', source=s2, size=20, color='green')
lout = row(p1, p2)
show(lout)
从bokeh.io导入输出文件
从bokeh.layouts导入行
从bokeh.plotting导入图形,显示
从bokeh.models导入(
ColumnDataSource、CustomJS、,
悬停工具、拉索选择工具)
输出文件('toggle\u lasso\u hover.html')
s1=列数据源({
“x”:[0,1,2],
y:[1,1,1]
})
s2=ColumnDataSource({
“x”:[],
‘y’:[]
})
js_args={'s1':s1,'s2':s2}
js_代码=”“”
var d1=s1.1数据;
变量d2={'x':[],'y':[]};
对于(i=0;i