如何在R中绘制展示两类分类变量的美国地图?
美国地图双变量可视化解决方案
问题背景
需要绘制美国地图,同时展示两类分类变量:
- 各州收入组别(用
fill映射) - 各州所属区域(用轮廓或粗边界映射)
目标是直观呈现低收入/高收入州在特定区域的聚集特征。尝试叠加两个geom_polygon图层后未得到预期效果。
数据准备代码
# 创建地图数据 state_map_data <- map_data("state") # 关联州区域与收入分组数据 state_regions <- tibble(state_name = tolower(state.name), state.region, as_tibble(state.x77)) %>% mutate(income_cat = cut(Income, breaks = 3, labels = c("low", "medium", "high"))) state_map_data <- state_map_data %>% left_join(state_regions, by = c("region" = "state_name"))
解决方案1:实现「收入填充+区域轮廓」效果
叠加图层失效的原因是第二个geom_polygon默认会填充颜色(覆盖底层的收入填充),只需给第二个图层设置fill=NA,并调整轮廓粗细即可:
# 双变量地图:收入填充 + 区域颜色轮廓 p <- ggplot() + # 底层:收入分组填充 geom_polygon(data = state_map_data, aes(x = long, y = lat, group = group, fill = income_cat)) + # 上层:区域轮廓(不填充,仅显示线条) geom_polygon(data = state_map_data, aes(x = long, y = lat, group = group, color = state.region), fill = NA, # 关键:取消填充,避免覆盖底层 size = 1) # 调整轮廓粗细,提升辨识度 print(p)
解决方案2:绘制粗线条的区域边界
若希望用更醒目的粗线条标记区域整体边界(而非单个州的轮廓),需先聚合数据到区域级别,再叠加图层:
# 聚合生成区域级地图数据 region_map_data <- state_map_data %>% group_by(state.region) %>% summarize( long = list(long), lat = list(lat) ) %>% ungroup() %>% mutate(region_group = row_number()) # 为每个区域分配唯一组号 # 收入地图 + 粗区域边界 p_region <- ggplot() + geom_polygon(data = state_map_data, aes(x = long, y = lat, group = group, fill = income_cat)) + geom_polygon(data = region_map_data, aes(x = unlist(long), y = unlist(lat), group = region_group), fill = NA, color = "black", # 可替换为按区域配色 size = 2) + # 大幅加粗线条 theme_minimal() print(p_region)
其他可选思路
- 分面可视化:按区域拆分子图,聚焦每个区域内的收入分布细节:
p_facet <- ggplot(state_map_data) + geom_polygon(aes(x = long, y = lat, group = group, fill = income_cat)) + facet_wrap(~state.region) + theme_void() print(p_facet)
- 添加统计标注:在各区域中心标注收入组占比,补充定量信息(需先计算区域内各组占比,再用
geom_text实现)。
内容的提问来源于stack exchange,提问作者rpc
相关产品推荐
相关产品推荐

