我有一个 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
图层上添加这个“不可见”源,只是为了显示具有精确值的工具提示。
我知道这在某种程度上违反了散景的原则,即显示的所有内容也必须包含在数据中。但在这种情况下,在我的上下文中,添加准确的工具提示信息会大大提高交互式绘图的可用性。