使散景的自定义 TapTool 适用于全息视图

Make bokeh's custom TapTool work for holoviews

我想使用散景 TapTool 在单击每个 holoviews.Polygons 时打开不同的 URL。 bokeh docs 是点数据的一个完美例子,它在散景中是如何工作的。但是,当我尝试在全息视图中使用它时,它似乎不起作用。 我能开始工作的最接近的事情是:

import geoviews as gv
from bokeh.models import OpenURL, TapTool


url = 'https://google.@domain'
taptool = TapTool()
taptool.callback = OpenURL(url=url)
p = gv.Polygons(data, vdims=['Area', 'domain'], crs=ccrs.PlateCarree).options(alpha=1, tools=['hover', taptool])
p

情节很好,URL 开头的触发工作正常,但是“@domain”的解析不起作用,URL 是“google。??? 这里有什么问题?

不确定;当我为这个荒谬的例子做这件事时似乎有效:

import holoviews as hv, numpy as np
hv.extension("bokeh")

def rectangle(x=0, y=0, width=.05, height=.05):
    return np.array([(x,y), (x+width, y), (x+width, y+height), (x, y+height)])

polys = hv.Polygons([{('x', 'y'): rectangle(x, y), 'level': z}
                     for x, y, z in np.random.rand(100, 3)], vdims='level')

url = 'https://google.@level'
taptool = TapTool()
taptool.callback = OpenURL(url=url)
polys.opts(color='level', line_width=1, tools=['hover', taptool])

您可以使用 hook 选项在全息视图中访问散景 figure,如 in the HoloViews docs here 所述。

通过访问散景图,您可以执行诸如连接任意回调之类的操作。 例如,在 python 回调中访问光标坐标,或处理 Tap 事件:

import holoviews as hv
from bokeh.events import MouseMove, Tap

def hook(plot, element):
  # allows access to the bokeh `figure` object
  # so we can bind figure interaction events
  plot.state.on_event(MouseMove, on_mouse_move)
  plot.state.on_event(Tap, on_click)   

  # The handles contain common plot objects
  # plot.handles

def on_mouse_move(event):
  # do something

def on_click(event):
   # do something

my_hv_plot = hv.Points([])
my_hv_plot.opts(hooks=[hook])