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

Plotly散点地图:如何避免标记文本重叠?

解决Scattergeo标记文本重叠的程序化方案

针对你遇到的大量相近标记文本重叠问题,以下几种程序化方案可以快速让地图变得整洁,不需要手动调整坐标:

  • 聚类聚合标记
    用聚类算法(比如DBSCAN)把地理位置相近的点合并成簇,只显示簇中心的标记和聚合后的统计信息(比如包含多少个点)。这种方法适合点数量极多的场景,直接减少标记总数:

    from sklearn.cluster import DBSCAN
    import numpy as np
    import plotly.graph_objects as go
    
    # 假设你的原始数据是经纬度数组
    longitudes = np.array([...])
    latitudes = np.array([...])
    coords = np.column_stack((longitudes, latitudes))
    
    # 用haversine距离计算(适合地理坐标),eps控制聚类的距离阈值(单位千米)
    db = DBSCAN(eps=5, min_samples=2, metric='haversine').fit(np.radians(coords))
    labels = db.labels_
    
    # 计算每个簇的中心和点数量
    cluster_lons, cluster_lats, cluster_texts = [], [], []
    for label in set(labels):
        if label == -1:
            # 单独处理噪声点(离群点)
            mask = labels == label
            cluster_lons.extend(longitudes[mask])
            cluster_lats.extend(latitudes[mask])
            cluster_texts.extend(['Single location' for _ in range(sum(mask))])
            continue
        mask = labels == label
        avg_lon = np.mean(longitudes[mask])
        avg_lat = np.mean(latitudes[mask])
        cluster_lons.append(avg_lon)
        cluster_lats.append(avg_lat)
        cluster_texts.append(f'Contains {sum(mask)} locations')
    
    # 绘制聚合后的地图
    fig = go.Figure(data=go.Scattergeo(
        lon=cluster_lons,
        lat=cluster_lats,
        text=cluster_texts,
        mode='markers+text',
        marker=dict(size=10, color='crimson')
    ))
    fig.update_layout(geo=dict(scope='usa'))
    fig.show()
    
  • 基于缩放级别的动态文本显示
    利用Plotly的交互回调,只在地图放大到一定级别时显示文本,低缩放级别仅显示标记。这样既能保证全局视图整洁,又能在需要查看细节时看到文本:

    from dash import Dash, dcc, html, Input, Output
    import plotly.graph_objects as go
    import numpy as np
    
    # 原始数据
    longitudes = np.array([...])
    latitudes = np.array([...])
    texts = np.array([...])
    
    app = Dash(__name__)
    app.layout = html.Div([dcc.Graph(id='usa-map')])
    
    @app.callback(
        Output('usa-map', 'figure'),
        Input('usa-map', 'relayoutData')
    )
    def adjust_text_display(relayout_data):
        # 获取当前缩放级别,默认3级(全局视图)
        current_zoom = relayout_data.get('geo.zoom', 3) if relayout_data else 3
        # 设置阈值,比如缩放级别≥8时显示文本
        display_mode = 'markers+text' if current_zoom >= 8 else 'markers'
    
        fig = go.Figure(data=go.Scattergeo(
            lon=longitudes,
            lat=latitudes,
            text=texts,
            mode=display_mode,
            marker=dict(size=6),
            textposition='top center'
        ))
        fig.update_layout(geo=dict(scope='usa'))
        return fig
    
    if __name__ == '__main__':
        app.run_server(debug=True)
    
  • 程序化坐标偏移(Jitter)
    给相近的坐标添加微小的随机偏移,让文本自然错开,同时保证标记仍在大致区域内。这种方法适合需要保留每个点的场景:

    import numpy as np
    import plotly.graph_objects as go
    
    longitudes = np.array([...])
    latitudes = np.array([...])
    texts = np.array([...])
    
    # 添加随机偏移,调整jitter_amount控制偏移幅度(单位:度)
    def add_jitter(lons, lats, jitter_amount=0.015):
        jittered_lons = lons + np.random.uniform(-jitter_amount, jitter_amount, size=len(lons))
        jittered_lats = lats + np.random.uniform(-jitter_amount, jitter_amount, size=len(lats))
        return jittered_lons, jittered_lats
    
    jit_lons, jit_lats = add_jitter(longitudes, latitudes)
    
    fig = go.Figure(data=go.Scattergeo(
        lon=jit_lons,
        lat=jit_lats,
        text=texts,
        mode='markers+text',
        marker=dict(size=5),
        textposition='bottom right'
    ))
    fig.update_layout(geo=dict(scope='usa'))
    fig.show()
    
  • 隐藏静态文本,用hover提示展示信息
    完全去掉静态文本,把需要展示的内容放在鼠标悬停的提示框里,彻底避免重叠问题:

    import plotly.graph_objects as go
    
    longitudes = [...]
    latitudes = [...]
    texts = [...]
    
    fig = go.Figure(data=go.Scattergeo(
        lon=longitudes,
        lat=latitudes,
        hovertext=texts,
        hoverinfo='text',
        mode='markers',
        marker=dict(size=6, color='darkblue')
    ))
    fig.update_layout(geo=dict(scope='usa'))
    fig.show()
    

内容的提问来源于stack exchange,提问作者bestfirstsearch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:07