如何在美国分级统计图中合并指定州?支持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
相关产品推荐
相关产品推荐

