3

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

# 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 的确切值,而不是图像中的分类值(类参考编号显示在上面Category的工具提示中)。canvas (x,y)似乎是指我的 GeoDataFrame 中的 x 和 y 箱。是否可以让工具提示查询我的原始 GeoDataFrame 以显示每个 bin 的确切值,而不是分类的?

我试图创建一个额外的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)

但我不知道如何在gv.Image图层上添加这个“不可见”源,只是为了显示具有精确值的工具提示。

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

4

1 回答 1

2

自己找到了答案:即使使用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,但它确实有效!

于 2020-02-26T12:57:57.300 回答