用plotly.express.scatter_geo绘地理散点图需确保lat/lon为数值型、按lat-lon顺序传入;嵌入网页须设to_html(include_plotlyjs='cdn');底图靠scope与projection协同控制;交互效果依赖hover_data、size_max等参数正确配置。

用 plotly.express.scatter_geo 快速生成基础地理散点图
直接调用 scatter_geo 是最省事的起点,它自动处理投影、底图和坐标系转换。只要数据里有 lat 和 lon(或 latitude/longitude),就能画出来。
常见错误是传入字符串型经纬度——scatter_geo 不会自动转 float,会静默失败或显示空白地图。务必提前清洗:
- 用
pandas.to_numeric(..., errors='coerce')转换列,并检查isna()比例 - 剔除明显越界的值(比如
lat > 90或lon > 180) - 确认坐标顺序:Plotly 默认
lat在前、lon在后,和 GeoJSON 相反
示例最小可行代码:
import plotly.express as px fig = px.scatter_geo(df, lat='lat', lon='lon', size='pop', hover_name='city')
嵌入网页时必须调用 fig.to_html(..., include_plotlyjs='cdn')
直接保存为 HTML 文件却不控制 JS 加载方式,会导致离线打不开或页面卡死。默认 to_html 会把整个 Plotly.js 打包进 HTML,文件动辄 3–5MB。
生产环境应强制走 CDN:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
include_plotlyjs='cdn'→ 引用官方 CDN,加载快且不占体积 - 若内网无外网访问,改用
include_plotlyjs='directory'+ 手动部署plotly.min.js - 绝对不要用
include_plotlyjs=True(默认值),尤其当页面要嵌多个图时
另需注意:to_html 生成的是完整 HTML 文档。如需嵌入已有网页,加参数 full_html=False,只取 <div> + <code><script></script> 块。
自定义底图与投影必须通过 scope、projection 和 fitbounds 控制
很多人以为换底图就是改 basemap 参数,但 Plotly 的地理图没有传统“底图”概念——它是靠 scope(范围)和 projection(投影)组合来决定视觉效果的。
关键行为差异:
-
scope='usa'会裁剪并放大美国区域,但底图仍是 Web Mercator;想显示真正等积的美国地图,得配projection='albers usa' -
fitbounds='locations'可让视图自动缩放到所有点所在国家/地区边界,比手动设center+scope更可靠 -
projection='natural earth'等非 Web Mercator 投影下,lat/lon坐标仍按原始值渲染,无需重投影
国内用户常遇到中国显示不全的问题:别硬调 scope='asia',改用 scope='world' + fitbounds='locations' + 手动 center={'lat': 35, 'lon': 105} 更稳。
交互功能依赖 hover_data、animation_frame 和 size_max 的协同设置
散点大小不随数值线性变化?鼠标悬停只显示坐标不显示字段?这些问题往往不是 Bug,而是参数没对齐。
-
size参数绑定的列必须为数值型,且默认使用平方根缩放;想线性映射,加size_max=50并配合size_min=4控制视觉范围 -
hover_data要显式列出你想展示的列,否则只显示hover_name和坐标;支持元组形式如hover_data=['city', 'year', ('pop', ':,.0f')]格式化数值 - 加时间维度动画时,
animation_frame列必须是字符串或类别型(astype(str)),不能是 datetime;否则动画条不出现或跳帧
性能提示:点数超过 5000 时,交互会明显变卡。此时应考虑用 px.density_mapbox 替代,或先用 datashader 聚合再喂给 Plotly。










