python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python可视化地理数据

Python使用Plotly Express实现可视化地理数据

作者:站大爷IP

这篇文章主要为大家详细介绍了Python如何使用Plotly Express实现可视化地理数据,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

一、为什么需要交互式地图

当传统静态地图只能展示固定信息时,交互式地图正在改变数据展示的规则。想象一下:用鼠标悬停就能查看某个城市的详细数据,点击图例可以筛选特定类别,缩放地图能发现隐藏的地理模式——这些动态功能让数据探索变得像玩游戏一样直观。

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

二、工具准备:轻量级解决方案

2.1 核心组件

2.2 为什么选择Plotly Express

相比其他可视化库,它有三大优势:

三、数据准备全流程

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.update_traces(
    text=[f"{row['city']}<br>人口: {row['population']}万<br>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="<b>%{customdata[0]}</b><br>PM2.5: %{customdata[1]}μg/m³<br>等级: %{customdata[2]}"
)
fig.for_each_trace(lambda t: t.update(customdata=air_df[['city', 'pm25', 'category']].values))

fig.show()

6.3 发现隐藏模式

通过交互功能发现:

七、常见问题Q&A

Q1:地图显示空白怎么办?

A:检查三个设置:

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:三个优化方案:

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使用Plotly Express实现可视化地理数据的详细内容,更多关于Python可视化地理数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文