如何为Plotly go.Scattermapbox配置customdata实现悬停展示外部数据
核心问题排查与修正方案
- customdata维度不匹配是取值失败的核心原因
使用np.dstack((hover_1, hover_2))生成的数组维度为(1, 站点总数, 2),但Plotly要求Scattermapbox的customdata必须是与散点逐点对应的二维结构,即维度为(站点总数, 自定义字段数)的格式。多嵌套的最外层维度会导致Plotly无法匹配到对应站点的数值,最终造成悬停模板中读取自定义数据失败。
正确的数组拼接方式可选用np.column_stack((hover_1, hover_2))或np.array([hover_1, hover_2]).T,两种方式生成的数组维度均为(站点总数, 2),完全匹配Plotly的参数要求。 - 缺失customdata的显式参数绑定
现有贴出的图形配置代码中,未在go.Scattermapbox的构造函数中传入计算好的customdata参数。即使自定义数组的数值完全正确,没有绑定到图形对象上,hovertemplate中的%{customdata}占位符也无法读取到对应数据。 - hovertemplate的索引规则说明
当customdata的维度匹配要求后,%{customdata[0]}会自动读取当前悬停散点对应自定义数组的第0位元素(即站点海拔),%{customdata[1]}读取第1位元素(即测量方法),无需额外特殊处理。
修正后的完整配置代码示例:
import numpy as np # 拼接两个自定义数组,生成符合维度要求的结构 custom_data = np.column_stack((hover_1, hover_2)) plot_data = [ go.Scattermapbox( lon=data_slctd["longitude"], lat=data_slctd["latitude"], mode="markers", text = data_slctd.site_name.tolist(), # 显式传入自定义数据 customdata=custom_data, hovertemplate = ( "<b>%{text}</b><br><br>" "longitude: %{lon:.2f}<br>" "latitude: %{lat:.2f}<br>" "altitude: %{customdata[0]:.0f}<br>" "measure method: %{customdata[1]}<br>" "ppm: %{marker.color:.2f}" "<extra></extra>" ), ) ]
注意:如果customdata中存储的是文本类数据(如测量方法名称),不要在模板占位符后添加数字格式化符号(如
.0f、.2f),否则会触发前端渲染报错。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

