如何用ggplot2绘制将美国分为蓝州与非蓝州的全球地图
解决方案
以下是基于ggplot2和sf包的实现方案,既能覆盖全球地图,又能合并美国蓝州/非蓝州并隐藏内部州边界:
1. 加载依赖包
library(ggplot2) library(dplyr) library(sf)
2. 处理美国州数据(合并蓝州/非蓝州,移除内部边界)
# 定义蓝州列表 blue_states <- tolower(c("California", "Illinois", "New York", "New Jersey", "Washington", "Massachusetts", "Oregon", "Connecticut", "Delaware", "Rhode Island", "District of Columbia", "Vermont")) # 读取美国州地图并转换为sf格式 us_states_sf <- map_data("state") %>% sf::st_as_sf(coords = c("long", "lat"), crs = 4326) %>% sf::st_sf() %>% group_by(group) %>% summarise(geometry = st_combine(geometry)) %>% st_cast("POLYGON") %>% mutate(state = tolower(region)) %>% # 标记蓝州/非蓝州分组 mutate(usa_group = ifelse(state %in% blue_states, "Blue USA", "Non-Blue USA")) # 合并同组多边形,移除内部州边界 us_combined_sf <- us_states_sf %>% group_by(usa_group) %>% summarise(geometry = st_union(geometry)) %>% rename(country = usa_group)
3. 处理全球其他国家数据
# 读取全球地图数据,过滤掉美国(用自定义分组替代) world_sf <- map_data("world") %>% sf::st_as_sf(coords = c("long", "lat"), crs = 4326) %>% sf::st_sf() %>% group_by(group) %>% summarise(geometry = st_combine(geometry)) %>% st_cast("POLYGON") %>% mutate(country = region) %>% filter(country != "USA")
4. 关联自定义数据
假设你的数据框名为custom_data,包含country和value列:
# 关联全球国家数据 world_merged <- world_sf %>% left_join(custom_data, by = "country") # 关联美国分组数据 us_merged <- us_combined_sf %>% left_join(custom_data, by = "country") # 合并所有地图数据 all_map_data <- bind_rows(world_merged, us_merged)
5. 绘制最终地图
ggplot() + geom_sf(data = all_map_data, aes(fill = value), color = "gray30", size = 0.1) + # 适配value范围的渐变配色 scale_fill_gradient2(low = "darkblue", mid = "white", high = "darkred", midpoint = 0, limits = c(-1, 1), name = "Value") + theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank() )
关键说明
- 用
sf包的st_union()合并同组州的多边形,彻底移除美国内部州边界,仅保留蓝州与非蓝州的分界 - 全球地图主动过滤美国,避免与自定义分组重复
- 通过
left_join确保自定义数据的value值与地图区域正确关联
内容的提问来源于stack exchange,提问作者bixiou
相关产品推荐
相关产品推荐

