来自不同数据源的带有 HoverTool 工具提示的 Holoviews 图像

Holoviews Image with HoverTool tooltip from different datasource

我有一个 100x100 公里的网格 GeoDataFrame (Mollweide),我将其绘制为 gv.Image,具有 class 化值(8 个类别)到 Holoviews/Bokeh:

# convert GeoDataFrame to xarray object
xa_dataset = gv.Dataset(grid.to_xarray(), vdims=f'{metric}_cat', crs=crs.Mollweide())
# convert to gv.Image
img_grid = xa_dataset.to(gv.Image)
# custom tooltip
hover = HoverTool(
    tooltips=[
        ("index", "$index"),
        ("data (using $) (x,y)", "($x, $y)"),
        ("data (using @) (x,y)", "(@x, @y)"),
        ("canvas (x,y)", "($sx, $sy)"),
        ("Category", "@image"),
    ])
image_layer = img_grid.opts(
        cmap=cmap_with_nodata,
        colorbar=True,
        colorbar_opts={
            'formatter': formatter,
            'major_label_text_align':'left'},
        tools=[hover],
        # optional unpack of width and height
        **{k: v for k, v in optional_kwargs.items() if v is not None}
    )
# combine layers and set global plotting options
gv_layers = (image_layer * gf.coastline * gf.borders).opts(
    projection=crs.Mollweide(),
    global_extent=True,
    responsive=responsive,
    finalize_hooks=[set_active_tool],
    title_format=title)

我可以将图像值显示为 HoverTool 工具提示,上面将导致以下工具提示:

但是,为了使它更有用,我想显示原始 GeoDataFrame 中每个 bin 的确切值,而不是图像中的 class 化值(class 参考编号在上面的工具提示中显示为 Category)。 canvas (x,y) 似乎是指我的 GeoDataFrame 中的 x 和 y bin。是否可以使工具提示查询我的原始 GeoDataFrame 以显示每个 bin 的确切值,而不是 class 化的值?

我尝试创建一个额外的 bokeh.plotting.ColumnDataSource:

grid_df = pd.DataFrame(grid[[col for col in grid.columns if col != grid._geometry_column_name]])
source = ColumnDataSource.from_df(grid_df)

但我不知道如何将此源 "invisible" 添加到 gv.Image 图层上,仅用​​于显示具有精确值的工具提示。

我知道这在某种程度上违背了散景原则,即显示的所有内容也必须包含在数据中。但在这种情况下,添加准确的工具提示信息会在我的上下文中大大提高交互式绘图的可用性。

自己找到答案:即使在使用 gv.Image 时,我也可以指定额外的 vdims,例如:

# xa_dataset from GeoDataFrame
# with additional vdims
xa_dataset = gv.Dataset(
    grid.to_xarray(),
    vdims=[f'{metric}_cat', 'postcount', 'usercount'],
    crs=crs.Mollweide())
# convert to gv.Image
img_grid = xa_dataset.to(gv.Image)
# custom tooltip
hover = HoverTool(
    tooltips=[
        ("Usercount", "@usercount{,f}"),
        ("Postcount",  "@postcount{,f}")
    ])

我其实不明白这些额外的 vdims 是如何存储在 gv.Image 中的,但它确实有效!