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

使用Cartopy绘制密歇根州县着色地图(Python)技术求助

密歇根州县龙卷风数据着色地图实现方案(Cartopy + MetPy)

核心思路

通过匹配自定义FIPS码与MetPy的USCOUNTIES几何数据集,筛选出仅包含数据的密歇根州县,再基于Cartopy实现着色地图绘制。


步骤1:导入依赖库

加载所需的地理绘图、数据处理工具:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from metpy.plots import USCOUNTIES
import pandas as pd

步骤2:整理数据集

将龙卷风数据字典转换为DataFrame,统一FIPS码的字符串类型,避免匹配错误:

# 你的密歇根州县龙卷风数据
tornado_data = {
    '26049': 44,
    '26115': 33,
    '26081': 32,
    '26163': 31,
    '26021': 30,
    '26005': 30,
    '26125': 28,
    '26155': 28,
    '26091': 28,
    '26161': 26,
    '26077': 25,
    '26059': 23,
    '26045': 23,
    '26145': 23,
    '26093': 22,
    '26067': 22,
    '26065': 22,
    '26099': 22,
    '26147': 21,
    '26139': 20,
    '26151': 18,
    '26037': 18,
    '26015': 17,
    '26157': 17,
    '26063': 16,
    '26159': 16,
    '26075': 16,
    '26087': 16,
    '26023': 15,
    '26129': 15,
    '26027': 14,
    '26017': 14,
    '26025': 13,
    '26007': 13,
    '26057': 13,
    '26073': 12,
    '26123': 12,
    '26133': 12,
    '26009': 11,
    '26041': 11,
    '26149': 11,
    '26111': 10,
    '26039': 10,
    '26069': 10,
    '26107': 10,
    '26103': 9,
    '26143': 9,
    '26051': 9,
    '26071': 8,
    '26035': 8,
    '26011': 8,
    '26001': 8,
    '26121': 8,
    '26165': 8,
    '26117': 8,
    '26079': 7,
    '26043': 7,
    '26113': 7,
    '26141': 7,
    '26003': 6,
    '26031': 6,
    '26119': 6,
    '26033': 6,
    '26109': 5,
    '26127': 5,
    '26047': 5,
    '26105': 5,
    '26137': 4,
    '26095': 4,
    '26053': 4,
    '26135': 4,
    '26085': 4,
    '26055': 3,
    '26131': 3,
    '26029': 3,
    '26089': 3,
    '26097': 3,
    '26019': 3,
    '26083': 2,
    '26153': 2,
    '26013': 2,
    '26101': 2,
    '26000': 1
}

# 转换为DataFrame并标准化FIPS格式
df = pd.DataFrame(list(tornado_data.items()), columns=['fips', 'tornado_count'])
df['fips'] = df['fips'].astype(str)

步骤3:筛选目标县的几何数据

遍历MetPy的USCOUNTIES集合,只保留你数据中存在的FIPS码对应的县几何:

# 存储筛选后的县几何与FIPS码
selected_counties = []
for geom, fips in USCOUNTIES.geometries():
    if fips in df['fips'].values:
        selected_counties.append((geom, fips))

步骤4:绘制着色地图

使用Lambert投影适配美国区域,根据龙卷风数量为县填充颜色,添加颜色条和标题:

# 创建兰伯特投影,适配密歇根州位置
proj = ccrs.LambertConformal(central_longitude=-84.5, central_latitude=44.0)

# 设置画布大小
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': proj})

# 限定显示范围为密歇根州(经纬度范围可微调)
ax.set_extent([-90.5, -82.0, 41.5, 48.0], crs=ccrs.PlateCarree())

# 配置颜色映射与归一化(用YlOrRd适配灾害类数据展示)
cmap = plt.cm.YlOrRd
vmin, vmax = df['tornado_count'].min(), df['tornado_count'].max()
norm = plt.Normalize(vmin=vmin, vmax=vmax)

# 逐个绘制选中的县,根据数据着色
for geom, fips in selected_counties:
    count = df.loc[df['fips'] == fips, 'tornado_count'].values[0]
    ax.add_geometries(
        [geom],
        crs=ccrs.PlateCarree(),
        facecolor=cmap(norm(count)),
        edgecolor='gray',
        linewidth=0.5
    )

# 添加颜色条
sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
fig.colorbar(sm, ax=ax, orientation='vertical', pad=0.02, label='1950-2022年龙卷风数量')

# 设置标题
ax.set_title('密歇根州县1950-2022年龙卷风数量分布')

# 显示地图
plt.show()

关键注意事项

  • FIPS码类型匹配:确保你的数据集FIPS是字符串,USCOUNTIES返回的FIPS也是字符串,避免因整数前导零丢失导致匹配失败(比如26001不能存为整数,否则和字符串匹配不上)。
  • 特殊FIPS处理:数据中的26000是密歇根州的全州汇总码,USCOUNTIES中没有对应的县几何,若不需要可提前从数据中删除。
  • 配色与范围调整:可根据需求更换colormap(如plt.cm.viridis),或微调set_extent的经纬度范围以更精准显示密歇根州。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:34:59