You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:01:24