Plotly Scattermapbox标记不显示,仅悬停提示与导出可见求助
Plotly Scattermapbox标记无法渲染(仅悬停/导出可见)的排查与修复
问题现象
原本正常运行的Plotly Scattermapbox组件突然无法渲染标记,断网后问题持续8小时,更换IDE、在Google Colab运行、切换数据集均无效。具体表现:
- 地图界面完全看不到标记
- 悬停到标记所在位置时,能正常显示提示框
- 将地图导出为PNG时,标记显示正常
相关代码
@app.callback( Output('2dmap','figure'), [Input('2dgraph', 'clickData'), Input('checklist', 'value')]) def update_map_2d(clickData,checklist): # ============================================================================= # P1. Render Map when no point is clicked # ============================================================================= # If No point has been clicked if clickData is None: #make a map maps2d = go.Figure(go.Scattermapbox( lat=[], # set lat and long lon=[], mode='markers', marker =({'size':5.5}) # make markers size variable )) # set up map layout maps2d.update_layout( autosize=True, # Autosize hovermode='closest', # Show info on the closest marker showlegend=True, # show legend of colors mapbox=dict( accesstoken=mapbox_access_token, # token bearing=0, # starting facing direction # starting location center=dict( lat=td.cLat, lon=td.cLong ), #angle and zoom pitch=0, zoom=12 ), #height and width width=1000, height=1000 ) return maps2d else: xCoord = int(clickData['points'][0]['x']) yCoord = int(clickData['points'][0]["y"]) solutionRow = preatoFrontier.loc[(preatoFrontier['x'] == xCoord)&(preatoFrontier['y'] == yCoord)] solId = int(solutionRow['SolId']) #solId = 49 solution = td.getSolution(solutions, solId) color = [] for row in solution['upGrade']: if row == 0: color.append('grey') if row == 1: color.append('green') if row == 2: color.append('blue') if row == 3: color.append('red') solution['color'] = color solution2 = solution[solution['color'].isin(checklist)] maps2d = go.Figure(go.Scattermapbox( lat=solution2['lat'], lon=solution2['long'], mode='markers', #marker =({'color':solution['color']},{'size':5.5}) marker=dict( size=12, color=solution2['color'], #set color equal to a variable colorscale='Viridis', # one of plotly colorscales showscale=True ) )) #============================================================================= # P3. Map Layout #============================================================================= #set up map layout maps2d.update_layout( autosize=False, # Autosize hovermode='closest', # Show info on the closest marker showlegend=True, # show legend of colors mapbox=dict( accesstoken=mapbox_access_token, # token bearing=0, # starting facing direction # starting location center=dict( lat=td.cLat, lon=td.cLong ), #angle and zoom pitch=0, zoom=10 ), #height and width width=1000, height=1000 ) return maps2d
问题根源分析
代码中存在离散颜色与连续颜色刻度的冲突:
- 为标记指定的是离散颜色值(grey/green/blue/red),但同时设置了
colorscale='Viridis'和showscale=True,这两个参数仅适用于基于数值的连续颜色映射。 - 这种配置冲突会导致Plotly在渲染标记时出现逻辑异常,界面上无法显示标记,但悬停和导出PNG的渲染逻辑不受此影响,因此能正常显示。
修复方案
1. 移除冲突的颜色配置
删除marker中的colorscale和showscale参数,保留离散颜色设置即可:
maps2d = go.Figure(go.Scattermapbox( lat=solution2['lat'], lon=solution2['long'], mode='markers', marker=dict( size=12, color=solution2['color'] # 仅保留离散颜色设置 ), hoverinfo='all' # 确保悬停信息正常显示(可选) ))
2. 额外验证步骤
- 确认
solution2数据集不为空:在创建图表前添加print(len(solution2)),检查是否有数据被过滤掉(比如checklist选中的颜色值与solution['color']不匹配) - 验证
lat/lon数据格式:确保这两个字段是数值类型,没有缺失值或字符串格式错误
3. 优化图例显示(可选)
如果需要显示离散颜色的图例,可以为每个颜色组单独创建Scattermapbox trace,或者通过legendgroup分组:
# 示例:按颜色分组创建trace for color_val in checklist: filtered = solution2[solution2['color'] == color_val] maps2d.add_trace(go.Scattermapbox( lat=filtered['lat'], lon=filtered['long'], mode='markers', marker=dict(size=12, color=color_val), name=color_val # 图例显示的名称 ))
内容的提问来源于stack exchange,提问作者Shahzad Ansari
相关产品推荐
相关产品推荐

