从CSV到交互式地图:用Plotly Express可视化地理数据

简介: 交互式地图让数据“活”起来:通过悬停、点击、缩放直观探索地理信息。结合Python的Pandas与Plotly Express,仅需几行代码即可实现散点图、热力图、线路图等可视化,支持自定义样式、动态筛选与多图层叠加,广泛应用于商业分析、环境监测、物流追踪等领域,零基础也能快速上手的空间数据分析利器。

​「编程类软件工具合集」
链接:https://pan.quark.cn/s/0b6102d9a66a

一、为什么需要交互式地图?
当传统静态地图只能展示固定信息时,交互式地图正在改变数据展示的规则。想象一下:用鼠标悬停就能查看某个城市的详细数据,点击图例可以筛选特定类别,缩放地图能发现隐藏的地理模式——这些动态功能让数据探索变得像玩游戏一样直观。
探秘代理IP并发连接数限制的那点事 (30).png

某连锁咖啡品牌通过交互式地图发现,其门店在大学城周边的客单价比商业区低23%,但复购率高41%。这种发现直接推动了会员体系的差异化运营策略。这就是交互式地图的魔力:它不仅是展示工具,更是数据分析的放大镜。

二、工具准备:轻量级解决方案
2.1 核心组件
Python 3.8+:主开发环境
Pandas:CSV数据处理
Plotly Express:交互式可视化引擎
Jupyter Notebook:交互式开发环境
2.2 为什么选择Plotly Express?
相比其他可视化库,它有三大优势:

一行代码出图:px.scatter_geo()就能完成基础地图
内置地理数据:自动识别国家/省份名称,无需额外GIS文件
动态交互:缩放、悬停、筛选等原生支持
三、数据准备全流程
3.1 CSV文件结构规范
理想的数据格式应包含:

地理标识:国家名、省份名、城市名或经纬度
数值字段:用于颜色映射的数值数据
分类字段:用于分组着色的类别数据
示例CSV结构:

city,latitude,longitude,population,gdp,category
北京,39.9042,116.4074,2171,40269.6,A
上海,31.2304,121.4737,2424,43214.9,B
广州,23.1291,113.2644,1530,28231.9,A

3.2 数据清洗技巧

使用Pandas处理常见问题:

import pandas as pd

读取CSV

df = pd.read_csv('cities_data.csv')

处理缺失值

df = df.dropna(subset=['latitude', 'longitude']) # 删除缺失经纬度的记录
df['population'] = df['population'].fillna(df['population'].median()) # 中位数填充人口缺失

统一格式

df['category'] = df['category'].str.upper() # 类别统一大写

3.3 地理编码转换
当只有地名没有经纬度时,可使用geopy库转换:

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geoapiExercises")

def get_coordinates(city_name):
location = geolocator.geocode(city_name)
if location:
return location.latitude, location.longitude
return None, None

示例:为"成都"获取坐标

lat, lon = get_coordinates("成都")

四、基础地图绘制三步法
4.1 散点地图:展示分布密度
import plotly.express as px

基础散点地图

fig = px.scatter_geo(df,
locations="city", # 使用城市名列
size="population", # 点大小映射人口
color="gdp", # 颜色映射GDP
projection="natural earth", # 地图投影类型
title="中国主要城市人口与GDP分布")

fig.show()

4.2 choropleth地图:区域着色

假设有省份级数据

province_df = pd.read_csv('provinces_data.csv')

fig = px.choropleth(province_df,
locations="province", # 省份列
locationmode="china", # 指定为中国地图
color="growth_rate", # 颜色映射增长率
color_continuous_scale="RdYlGn", # 红黄绿色标
title="各省经济增长率热力图")

fig.show()

4.3 线路地图:展示流动关系

假设有航线数据

flight_df = pd.DataFrame({
'origin': ['北京', '上海', '广州'],
'destination': ['上海', '广州', '北京'],
'flights': [120, 95, 80]
})

fig = px.line_geo(flight_df,
locations="origin",
color="flights",
color_continuous_scale=px.colors.sequential.Plasma,
projection="orthographic", # 球体投影
title="主要城市航线热度图")

fig.update_geos(fitbounds="locations") # 自动调整视角
fig.show()

五、进阶技巧:让地图更专业
5.1 自定义地图范围
fig.update_geos(
scope="asia", # 只显示亚洲
visible=[], # 隐藏所有国家边界
landcolor="rgb(217, 217, 217)", # 陆地颜色
oceancolor="rgb(186, 224, 238)", # 海洋颜色
showcoastlines=True # 显示海岸线
)

5.2 添加动态标注
fig.updatetraces(
text=[f"{row['city']}
人口: {row['population']}万
GDP: {row['gdp']}亿"
for
, row in df.iterrows()],
hoverinfo="text" # 自定义悬停信息
)

5.3 多图层叠加

先创建底图

base_fig = px.scatter_geo(df, locations="city", size="population", color_discrete_sequence=["gray"])

添加新图层

base_fig.add_trace(
go.Scattergeo(
locations=df["city"],
locationmode="country names",
mode="markers+text",
marker=dict(size=df["gdp"]/1000, color="red"),
text=df["city"],
textposition="top center",
showlegend=False
)
)

六、实战案例:分析全国空气质量
某环保组织收集了全国337个城市的PM2.5数据,我们用交互式地图展示:

6.1 数据预处理

读取数据

air_df = pd.read_csv('air_quality.csv')

清洗数据

air_df = air_df.dropna(subset=['latitude', 'longitude'])
air_df['pm25'] = pd.to_numeric(air_df['pm25'], errors='coerce')
air_df = air_df.dropna(subset=['pm25'])

添加分类字段

def categorize_pm(value):
if value < 35:
return "优"
elif value < 75:
return "良"
elif value < 115:
return "轻度污染"
elif value < 150:
return "中度污染"
else:
return "重度污染"

air_df['category'] = air_df['pm25'].apply(categorize_pm)

6.2 绘制分级地图
fig = px.scatter_geo(air_df,
lat="latitude",
lon="longitude",
color="category",
size="pm25",
color_discrete_map={
"优": "green",
"良": "yellow",
"轻度污染": "orange",
"中度污染": "red",
"重度污染": "purple"
},
size_max=30,
title="全国城市PM2.5实时分布图",
scope="china")

添加自定义悬停信息

fig.update_traces(
hovertemplate="%{customdata[0]}
PM2.5: %{customdata[1]}μg/m³
等级: %{customdata[2]}"
)
fig.for_each_trace(lambda t: t.update(customdata=air_df[['city', 'pm25', 'category']].values))

fig.show()

6.3 发现隐藏模式
通过交互功能发现:

地理集群:京津冀地区重度污染城市占比达67%
季节规律:冬季PM2.5平均值比夏季高82%
经济关联:GDP前50城市中,42个空气质量未达"良"标准
七、常见问题Q&A
Q1:地图显示空白怎么办?
A:检查三个设置:

确认scope参数正确(如中国地图用scope="china")
检查locationmode是否匹配(地名用"country names",经纬度用"geo"`)
确保数据中无缺失的地理标识
Q2:如何调整地图中心点?
A:使用center参数指定经纬度:

fig.update_geos(center=dict(lon=116.4, lat=39.9)) # 定位到北京

Q3:颜色映射不理想如何调整?
A:通过color_continuous_scale参数指定色标:

预定义色标列表

px.colors.sequential.Blues # 蓝渐变色
px.colors.diverging.RdYlGn # 红黄绿色标
px.colors.qualitative.Pastel # 柔和分类色

Q4:如何导出高清图片?
A:在Jupyter中调用:

fig.write_image("map.png", scale=2, width=1600, height=900)

需要安装kaleido库:pip install kaleido

Q5:数据量大会卡顿怎么办?
A:三个优化方案:

减少显示点数:df = df.sample(1000)随机抽样
增大点大小:size_max=50
使用px.choropleth替代散点图
Q6:如何添加图例筛选器?
A:Plotly Express自动生成图例筛选,若需自定义:

fig.update_layout(
updatemenus=[
dict(
type="buttons",
direction="right",
buttons=list([
dict(args=[{"color": "category"}], label="按等级分类"),
dict(args=[{"color": "pm25"}], label="按数值渐变")
])
)
]
)

八、延伸应用场景
物流监控:实时展示货物运输轨迹
疫情追踪:动态更新病例分布热力图
商业选址:分析目标区域的人口密度与消费能力
旅游规划:标记景点分布与游客评价
灾害响应:叠加地震震中与人口密集区
当传统地图还在用不同深浅的蓝色表示数据时,交互式地图已经能通过动画展示时间变化,用3D效果呈现地形起伏,用联动筛选实现多维度分析。掌握Plotly Express,意味着你拥有了一个随身携带的地理数据分析实验室——不需要专业GIS知识,不需要复杂代码,只需几行Python就能解锁数据的空间维度。

目录
相关文章
|
数据采集 自然语言处理 算法
使用Python进行简单文本分类
本文将通过Python编程语言介绍如何实现简单的文本分类,包括数据预处理、特征提取和模型训练等步骤。我们将使用scikit-learn库中的朴素贝叶斯分类器作为示例,展示如何训练模型并进行预测。通过本文,你将学会如何使用Python进行文本分类任务,并了解其背后的基本原理。
|
Ubuntu Linux 网络安全
从头安装Arch Linux系统
本文记录了作者安装Arch Linux系统的过程,包括安装成果展示和遇到的疑难点及其解决方法,如硬盘不足、下载失败、设置时区、安装微码和配置无密码登录等。
529 1
从头安装Arch Linux系统
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
【飞天技术沙龙—阿里云金融量化策略回测Workshop】在上海诺亚财富中心正式举行,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。
|
负载均衡 应用服务中间件 网络安全
深入理解Nginx与Ribbon的区别
深入理解Nginx与Ribbon的区别
432 0
|
SQL 关系型数据库 MySQL
MySQL AUTO_INCREMENT 原理解析
在关系型数据库MySQL中,AUTO_INCREMENT是数据库的一个属性,该属性使得在申明了AUTO_INCREMENT的列中可以自动生成唯一的递增值。本文详细介绍了在InnoDB及MyISAM引擎中AUTO_INCREMENT的使用原理及一些容易被忽略的问题。
1206 0
|
数据挖掘 数据处理 索引
一文秒懂Pandas中的crosstab与pivot
一文秒懂Pandas中的crosstab与pivot
561 0
|
资源调度 自然语言处理 JavaScript
【Vue 2】一个高效的低代码表单,可视化设计,一键生成源码
Variant Form 是一款基于 Vue 2 的低代码表单生成器,采用可视化拖拽设计界面,支持一键生成完整源码,大幅降低开发复杂度。其高度自定义特性可满足多种场景需求,无论是简单输入框还是复杂多级表单,都能轻松实现。此外,项目完全开源免费,适合有个性化需求的企业和开发者。主要功能包括拖拽式表单设计、自定义 CSS 样式、国际化多语言等,兼容 IE 11 浏览器,并支持导出 Vue 组件及 HTML 源码。通过简单的安装步骤即可在本地环境中搭建和使用 Variant Form,大幅提升开发效率。
630 0
|
存储 JSON 前端开发
gin框架学习笔记(四) ——参数绑定与参数验证
gin框架学习笔记(四) ——参数绑定与参数验证
617 0
|
数据挖掘 索引 Python
【100天精通Python】Day60:Python 数据分析_Pandas高级功能-数据透视表pivot_table()和数据交叉表crosstab()常用功能和操作
【100天精通Python】Day60:Python 数据分析_Pandas高级功能-数据透视表pivot_table()和数据交叉表crosstab()常用功能和操作
575 1
|
存储
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
629 0