使用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
相关产品推荐
相关产品推荐

