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

如何在美国分级统计图中合并指定州?支持Folium/Plotly

美国自定义合并州的分级统计图实现方案

问题说明

需要制作美国分级统计图,将路易斯安那州(LA)、密西西比州(MS)、阿拉巴马州(AL)和阿肯色州(AR)合并为一个区域展示,其余各州保持独立;此前尝试给数据添加region列并修改folium.Choropleth的columns参数未成功。


方法一:使用Folium实现

核心问题:原GeoJSON数据按单个州划分,仅修改数据的region列无法让地图识别合并区域,需修改GeoJSON的属性字段,让合并后的州拥有统一region标识,再关联数据渲染。

步骤1:处理GeoJSON与数据

import folium
import pandas as pd
import json

# 加载本地数据文件(需提前准备美国州边界GeoJSON和失业率CSV)
state_geo = "us-states.json"
state_unemployment = "US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)

# 读取并修改GeoJSON,给每个区域添加自定义region属性
with open(state_geo, 'r') as f:
    geo_json = json.load(f)

# 定义需要合并的州缩写和合并后的区域名称
merged_states = ['LA', 'MS', 'AL', 'AR']
merged_region_name = '南部核心区'

for feature in geo_json['features']:
    state_id = feature['id']
    if state_id in merged_states:
        feature['properties']['region'] = merged_region_name
    else:
        # 其他州用自身名称作为唯一region
        feature['properties']['region'] = feature['properties']['name']

# 处理失业率数据:合并指定州的数值(这里取平均值,可根据需求改为总和)
merged_data = state_data.copy()
merged_data['Region'] = merged_data['State'].apply(
    lambda x: merged_region_name if x in merged_states else x
)
merged_data = merged_data.groupby('Region')['Unemployment'].mean().reset_index()

步骤2:绘制分级统计图

# 创建地图实例,聚焦美国南部区域
sample_map = folium.Map(location=[35, -90], zoom_start=5)

# 绘制分级图,匹配GeoJSON中的自定义region属性
folium.Choropleth(
    geo_data=geo_json,
    name="choropleth",
    data=merged_data,
    columns=["Region", "Unemployment"],
    key_on="feature.properties.region",  # 关键:关联GeoJSON的region属性
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=.1,
    legend_name="失业率 (%)",
).add_to(sample_map)

# 添加图层控制
folium.LayerControl().add_to(sample_map)
sample_map.save('custom_choropleth.html')

方法二:使用Plotly实现

Plotly无需修改GeoJSON,直接通过自定义映射字典实现区域合并,操作更简洁:

import plotly.express as px
import pandas as pd

# 加载本地失业率数据文件
state_unemployment = "US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)

# 定义州到自定义区域的映射
region_mapping = {
    'LA': '南部核心区',
    'MS': '南部核心区',
    'AL': '南部核心区',
    'AR': '南部核心区'
}

# 给数据添加自定义region列
state_data['region'] = state_data['State'].apply(
    lambda x: region_mapping.get(x, x)  # 未指定的州保留原名称
)

# 按自定义区域聚合数据
agg_data = state_data.groupby('region')['Unemployment'].mean().reset_index()

# 绘制交互式分级图
fig = px.choropleth(
    agg_data,
    locations='region',
    locationmode='USA-states',  # 指定美国州坐标系
    color='Unemployment',
    color_continuous_scale='YlGn',
    scope='usa',  # 聚焦美国地图范围
    labels={'Unemployment': '失业率 (%)'},
    title='美国自定义区域失业率分级图'
)

# 调整布局边距
fig.update_layout(margin={"r":0,"t":50,"l":0,"b":0})
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:10:30