考虑下面the Bokeh Docs中的示例,有没有办法调整TapTool,以便当我点击一个圆圈时,我会被带到相同标签上的网址而不是打开一个新标签?文档字符串表明唯一的行为是打开一个新标签,但也许有一个CustomJS解决方法或其他一些黑客来解决这个问题?
from bokeh.models import ColumnDataSource, OpenURL, TapTool
from bokeh.plotting import figure, output_file, show
output_file("openurl.html")
p = figure(plot_width=400, plot_height=400,
tools="tap", title="Click the Dots")
source = ColumnDataSource(data=dict(
x=[1, 2, 3, 4, 5],
y=[2, 5, 8, 2, 7],
color=["navy", "orange", "olive", "firebrick", "gold"]
))
p.circle('x', 'y', color='color', size=20, source=source)
url = "http://www.colors.commutercreative.com/@color/"
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url)
show(p)
我包装了一些javascript而没有成功(从this question借用,但对于如何实现它却毫无头绪)。这导致没有链接打开:
callback = CustomJS(args=dict(source=source), code="""
url = data['url']
window.open(url,"_self");
""")
taptool = p.select(type=TapTool)
taptool.callback = callback
我还尝试使用<a>
关键字将tag
标记视为OpenURL。这是盲目的尝试,因为我找不到任何关于如何正确使用这个tag
术语的内容。这里没有运气。
url = "http://www.colors.commutercreative.com/@color/"
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url, tags=["_self"])
我理解Bokeh仍然很新,所以也许这个功能还没有。如果你知道足够的javascript(我显然没有),我仍然认为有一个解决方法。
答案 0 :(得分:2)
tags
是一个尘土飞扬的功能,它们与此无关。它们只是允许您将一些任意信息附加到Bokeh Model
,如果您在以后查找该特定模型时查询对象图形,这可能会有所帮助。
从Bokeh 0.12.3
开始,OpenURL
不支持此功能,只需调用window.open
:
https://github.com/bokeh/bokeh/blob/master/bokehjs/src/coffee/models/callbacks/open_url.coffee#L18
为name
window.open
参数添加新属性只需要几行代码。我建议在issue tracker上打开功能请求问题。如果您有兴趣使用PR来实现此功能,我们将很乐意帮助新贡献者入门。
这也可以通过CustomJS
回调来完成。如果你只想在点击一个圆圈时打开一个固定的URL,就像
callback = CustomJS(args=dict(source=source), code="""
window.open("http://foo.com" ,"_self");
""")
如果您的数据源中有一个列具有完整的网址,并且您希望根据所选索引选择一个列,则需要执行更类似OpenURL
回调功能的操作:关闭所选索引数据源,然后使用选定的索引从然后调用window.open
中获取数据源中列的URL。这是一个完整的例子:
来自bokeh.plotting导入图,output_file,show 来自bokeh.models导入CustomJS,ColumnDataSource,TapTool
source = ColumnDataSource(data=dict(
x = [1, 2],
y = [3, 4],
url = ["http://google.com", "http://bing.com"],
))
p = figure(tools="tap")
p.circle('x', 'y', size=15, source=source)
code = """
selection = require("core/util/selection")
indices = selection.get_indices(source)
for (i = 0; i < indices.length; i++) {
ind = indices[i]
url = source.data['url'][ind]
window.open(url, "_self")
}
"""
taptool = p.select(type=TapTool)
taptool.callback = CustomJS(args=dict(source=source), code=code)
output_file("/tmp/foo.html")
show(p)