HoloViews多边形绘图如何关联数据源实现tooltip显示region_id
问题原因
构造hv.Polygons时仅传入了多边形坐标点列表,未将region_id作为关联维度绑定到图形元素上,底层Bokeh的HoverTool找不到对应数据源字段,因此tooltip会显示???占位符。
修复方案
构造Polygons对象时,将每个多边形的坐标和对应的region_id值绑定传入,同时通过vdims参数声明额外的值维度,让HoloViews把关联字段写入渲染数据源,即可让tooltip正常读取值。
完整可运行代码如下:
import warnings import numpy as np import pandas as pd import holoviews as hv from bokeh.models import HoverTool warnings.filterwarnings("ignore", category=DeprecationWarning) hv.extension('bokeh') # 原始示例数据 data_dict = {'depth': {12: np.array([143.31908832, 174.03133903, 165.65527066, 160.07122507, 162.86324786, 155.88319088, 153.78917379, 152.39316239, 152.39316239, 127.26495727, 131.45299145, 131.45299145, 133.54700855, 152.39316239, 135.64102564, 144.01709402, 156.58119658, 134.24501424]), 13: np.array([169.84330484, 189.38746439, 178.91737892, 166.35327635]), 14: np.array([173.33333333, 187.29344729, 190.08547009, 176.12535613]), 15: np.array([199.15954416, 211.72364672, 211.72364672, 199.15954416]), 16: np.array([179.61538462, 194.27350427, 194.27350427, 179.61538462])}, 'ping_time': {12: np.array(['2017-06-28T22:47:51.213500000', '2017-06-28T22:48:37.570900000', '2017-06-28T22:49:46.736800000', '2017-06-28T22:50:41.866800000', '2017-06-28T22:51:17.024100000', '2017-06-28T22:51:24.038300000', '2017-06-28T22:51:48.138600000', '2017-06-28T22:52:17.414900000', '2017-06-28T22:52:58.491200000', '2017-06-28T22:53:02.007000000', '2017-06-28T22:52:18.584100000', '2017-06-28T22:51:47.552200000', '2017-06-28T22:51:22.284000000', '2017-06-28T22:51:16.439500000', '2017-06-28T22:50:40.112400000', '2017-06-28T22:49:45.568000000', '2017-06-28T22:48:36.390400000', '2017-06-28T22:47:57.668800000'], dtype='datetime64[ns]'), 13: np.array(['2017-06-28T22:46:27.321600000', '2017-06-28T22:46:27.321600000', '2017-06-28T22:47:07.220500000', '2017-06-28T22:47:04.293000000'], dtype='datetime64[ns]'), 14: np.array(['2017-06-28T22:43:49.614200000', '2017-06-28T22:43:49.614200000', '2017-06-28T22:44:02.499000000', '2017-06-28T22:44:02.499000000'], dtype='datetime64[ns]'), 15: np.array(['2017-06-28T22:44:30.584400000', '2017-06-28T22:44:30.584400000', '2017-06-28T22:45:14.003600000', '2017-06-28T22:45:14.003600000'], dtype='datetime64[ns]'), 16: np.array(['2017-06-28T23:02:20.571500000', '2017-06-28T23:02:20.571500000', '2017-06-28T23:02:58.034900000', '2017-06-28T23:02:58.034900000'], dtype='datetime64[ns]')}, 'region_id': {12: 14, 13: 15, 14: 16, 15: 17, 16: 18}} data_df = pd.DataFrame.from_dict(data_dict) # 配置hover工具 tooltips = [ ('RegionID', '@region_id') ] hover = HoverTool(tooltips=tooltips) # 构造多边形时绑定region_id维度 region_poly = hv.Polygons( [(np.array(list(zip(x,y))), rid) for x, y, rid in zip(data_df.ping_time, data_df.depth, data_df.region_id)], vdims=['region_id'] ).opts(tools=[hover], alpha=0.3, color='r', xrotation=45, width=800, height=400) region_poly
注意事项
- 原写法仅传入坐标数组时,HoloViews只会生成x、y两个基础维度,不存在
region_id字段,HoverTool自然无法读取对应值 - 传入数据时将每个多边形的关联属性和坐标绑定,再通过
vdims声明额外值维度,HoloViews会自动将这些字段同步到底层Bokeh的ColumnDataSource中,tooltip即可正常渲染 - 后续如果需要新增其他tooltip展示字段,只需把对应值加入传入的元组,同时在
vdims列表中注册对应字段名即可
内容的提问来源于stack exchange,提问作者Rory Majule
相关产品推荐
相关产品推荐

