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

如何解决Scattergeo中标记大小调整导致点位重叠的问题?

问题:Go.Scattergeo气泡地图中大气泡覆盖小气泡

我用go.scattergeo制作气泡地图,整体功能正常,但调整气泡大小(每个气泡对应一个数值)时,最大的气泡会完全覆盖最小的气泡。我试过另外两种注释掉的气泡大小设置,结果完全一致。调整颜色不影响点位显示,查了Plotly完整文档也没找到相关说明,求问哪里操作出错了?

数据集说明

使用的是添加了出发港口经纬度的泰坦尼克号数据集,以下是10行样本:

PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareEmbarkedlonlat
0103Braund, Mr. Owen Harris022.010A/5 211717.250-1.406013
1211Cumings, Mrs. John Bradley (Florence Briggs Th...)138.010PC 1759971.28331-8.294143
2313Heikkinen, Miss. Laina126.000STON/O2. 31012827.9250-1.406013
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)135.01011380353.10-1.406013
4503Allen, Mr. William Henry035.0003734508.050-1.406013
5603Moran, Mr. James029.699118003308778.45832-1.612260
6701McCarthy, Mr. Timothy J054.0001746351.86250-1.406013
7803Palsson, Master. Gosta Leonard02.03134990921.0750-1.406013
8913Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)127.00234774211.13330-1.406013
91012Nasser, Mrs. Nicholas (Adele Achem)114.01023773630.07081-8.294143

数据预处理代码

df.replace({'Embarked':{'S':0, 'C':1, 'Q':2}}, inplace=True)
df.loc[df['Embarked']==0, 'lon'] = '-1.406013'
df.loc[df['Embarked']==1, 'lon'] = '-8.294143'
df.loc[df['Embarked']==2, 'lon'] = '-1.612260'

df.loc[df['Embarked']==0, 'lat'] = '50.896364'
df.loc[df['Embarked']==1, 'lat'] = '51.850910'
df.loc[df['Embarked']==2, 'lat'] = '49.648194'

气泡地图绘制代码

import plotly.graph_objects as go
import numpy as np

sizearray = np.asarray(df['lon'].value_counts())

fig = go.Figure(data=go.Scattergeo(lon = df['lon'],lat = df['lat'],mode = 'markers'))

fig.update_layout(
        title = 'Shipping Ports',geo_scope='world',)
fig.update_geos(fitbounds="locations") 
fig.update_traces(marker=dict(size=sizearray,sizemode='area',sizeref=2.*max(sizearray)/(40.**2),sizemin=4))
#fig.update_traces(marker_size=sizearray/5)
#fig.update_traces(marker_size=df['lon'].value_counts()/5)
fig.update_traces(marker=dict(color=['rgb(93, 164, 214)', 'rgb(255, 144, 14)','rgb(44, 160, 101)']))
fig.show()

解决方案

问题核心是重复绘制同港口的所有乘客点,以及气泡大小数组与数据点数量不匹配:

  1. 你当前传入Scattergeo的是整个数据集的经纬度,等于给每个乘客都画了一个点,同一港口的点完全重叠;而sizearray只有3个元素(对应3个港口的乘客数),Plotly会循环复用这个数组,最终大数值的气泡覆盖了同港口的所有小点。
  2. 正确做法是先聚合数据,只保留每个港口的唯一经纬度和对应的乘客总数,再绘制气泡。

修改后的代码

import plotly.graph_objects as go
import numpy as np

# 聚合港口数据:按港口分组,获取唯一经纬度和乘客总数
port_data = df.groupby('Embarked').agg({
    'lon': 'first',
    'lat': 'first',
    'PassengerId': 'count'
}).reset_index()

# 将字符串类型的经纬度转为数值型(避免Plotly定位偏差)
port_data['lon'] = port_data['lon'].astype(float)
port_data['lat'] = port_data['lat'].astype(float)

fig = go.Figure(data=go.Scattergeo(
    lon = port_data['lon'],
    lat = port_data['lat'],
    mode = 'markers',
    marker=dict(
        size=port_data['PassengerId'],  # 直接用聚合后的乘客数作为气泡大小
        sizemode='area',
        sizeref=2.*max(port_data['PassengerId'])/(40.**2),
        sizemin=4,
        color=['rgb(93, 164, 214)', 'rgb(255, 144, 14)','rgb(44, 160, 101)']
    )
))

fig.update_layout(
    title = 'Shipping Ports',
    geo_scope='world',
)
fig.update_geos(fitbounds="locations") 
fig.show()

关键修改点

  • 聚合去重:用groupby得到每个港口的唯一数据,避免重复绘制同一港口的大量点;
  • 修正数据类型:将字符串格式的经纬度转为数值型,确保Plotly定位准确;
  • 匹配气泡大小:直接绑定聚合后的乘客总数到气泡大小,每个港口对应唯一的气泡尺寸。

修改后每个港口只会显示一个气泡,大小对应乘客数量,不会再出现覆盖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:50:25