寻求可复用的Python美国6区域自定义Choropleth地图实现方案
美国6区域Choropleth地图可复用实现方案
以下是两种可直接复用的实现方案,均能满足「填入区域总数+颜色分级」的需求:
方案1:用Plotly Express快速生成交互式地图
Plotly适合做交互式可视化,代码简洁,颜色分级配置灵活,支持hover显示详情。
步骤&代码
- 安装依赖:
pip install plotly pandas
- 可复用代码:
import plotly.express as px import pandas as pd # 定义美国6区域的州映射(标准划分,可按需调整) region_state_map = { "新英格兰": ["ME", "NH", "VT", "MA", "RI", "CT"], "中大西洋": ["NY", "NJ", "PA"], "中西部": ["OH", "IN", "IL", "MI", "WI", "MN", "IA", "MO", "ND", "SD", "NE", "KS"], "南部": ["DE", "MD", "DC", "VA", "WV", "NC", "SC", "GA", "FL", "KY", "TN", "AL", "MS", "AR", "LA", "OK", "TX"], "西南部": ["AZ", "NM"], "西部": ["MT", "ID", "WY", "CO", "WA", "OR", "CA", "NV", "UT"] } # 转换为州-区域映射,方便关联数据 state_to_region = {} for region, states in region_state_map.items(): for state in states: state_to_region[state] = region # 替换为你的实际区域总数数据 region_data = pd.DataFrame({ "区域": ["新英格兰", "中大西洋", "中西部", "南部", "西南部", "西部"], "总数": [1200, 3500, 2800, 4200, 900, 2100] }) # 关联州与区域数据 state_df = pd.DataFrame({"state": list(state_to_region.keys())}) state_df["区域"] = state_df["state"].map(state_to_region) state_df = state_df.merge(region_data, on="区域", how="left") # 生成Choropleth地图 fig = px.choropleth( state_df, locations="state", locationmode="USA-states", color="总数", color_continuous_scale="Blues", # 可替换为Reds/Greens等色阶 scope="usa", labels={"总数": "区域总数"}, hover_data=["区域", "总数"] ) # 自定义颜色分级区间(可选) fig.update_layout(coloraxis_colorbar=dict( title="总数", tickvals=[900, 2000, 3000, 4200], ticktext=["低", "中", "高", "极高"] )) fig.show()
方案2:用GeoPandas生成静态地图
适合需要导出高清静态图的场景,可精细控制地图样式与分级逻辑。
步骤&代码
- 安装依赖:
pip install geopandas matplotlib mapclassify
- 可复用代码:
import geopandas as gpd import matplotlib.pyplot as plt import mapclassify # 加载美国州级地理数据 us_states = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')).query("iso_a3 == 'USA'") us_states = us_states.to_crs("EPSG:4326") # 定义6区域映射(同上,可按需调整) region_state_map = { "新英格兰": ["Maine", "New Hampshire", "Vermont", "Massachusetts", "Rhode Island", "Connecticut"], "中大西洋": ["New York", "New Jersey", "Pennsylvania"], "中西部": ["Ohio", "Indiana", "Illinois", "Michigan", "Wisconsin", "Minnesota", "Iowa", "Missouri", "North Dakota", "South Dakota", "Nebraska", "Kansas"], "南部": ["Delaware", "Maryland", "District of Columbia", "Virginia", "West Virginia", "North Carolina", "South Carolina", "Georgia", "Florida", "Kentucky", "Tennessee", "Alabama", "Mississippi", "Arkansas", "Louisiana", "Oklahoma", "Texas"], "西南部": ["Arizona", "New Mexico"], "西部": ["Montana", "Idaho", "Wyoming", "Colorado", "Washington", "Oregon", "California", "Nevada", "Utah"] } # 关联区域到州数据 us_states["区域"] = us_states["name"].map({state: region for region, states in region_state_map.items() for state in states}) # 替换为你的实际区域总数数据 region_data = { "新英格兰": 1200, "中大西洋": 3500, "中西部": 2800, "南部": 4200, "西南部": 900, "西部": 2100 } us_states["总数"] = us_states["区域"].map(region_data) # 按分位数做颜色分级(也可改用equal_interval等方法) classifier = mapclassify.Quantiles(us_states["总数"], k=4) us_states["等级"] = classifier.yb # 绘制地图 fig, ax = plt.subplots(1, 1, figsize=(12, 8)) us_states.plot(column="总数", cmap="Blues", scheme="quantiles", k=4, legend=True, ax=ax, legend_kwds={"loc": "lower left", "title": "区域总数"}) ax.set_title("美国6区域总数分级地图") ax.axis('off') plt.show()
关键调整点
- 可修改
region_state_map中的州列表,匹配你需要的6区域划分 - 颜色方案可替换为Matplotlib/Plotly支持的任意色阶(如
viridis、Reds) - 颜色分级逻辑:Plotly通过
tickvals自定义区间,GeoPandas通过scheme参数选择分级方法(分位数/等距等)
内容的提问来源于stack exchange,提问作者kvsider
相关产品推荐
相关产品推荐

