使用ggplot2绘制美国本土48州着色地图出现图形异常求助
问题解决:美国本土48州地图绘制异常修复
核心问题原因
merge()函数会打乱us_map返回数据的原始顶点顺序,geom_polygon依赖顶点顺序绘制多边形,顺序错乱会导致图形破碎、空白。- 原始数据包含阿拉斯加(AK)和夏威夷(HI),不符合"本土48州"的需求,且这两个州的坐标会干扰地图布局。
修正后的代码方案
推荐使用usmap包自带的plot_usmap()函数,它会自动处理多边形顺序和坐标布局,避免手动操作的错误:
install.packages("usmap") install.packages("ggplot2") library(usmap) library(ggplot2) # 生成仅包含本土48州的排名数据(剔除AK、HI) state_rankings <- data.frame( state = c("AL", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"), ranking = runif(48, min = -2, max = 2) ) # 使用usmap专用绘图函数,自动处理多边形顺序和布局 plot_usmap(data = state_rankings, values = "ranking", color = "black") + scale_fill_gradient2( low = "red", mid = "white", high = "green", midpoint = 0, limits = c(-2, 2) # 固定颜色映射范围,确保深浅对应-2到2的程度 ) + theme_void() + theme(legend.position = "bottom")
手动处理ggplot的替代方案(若需自定义更多细节)
如果一定要直接用ggplot()处理原始多边形数据,需要保证合并后的数据保留原始顶点顺序,可以用dplyr::left_join替代merge,并按order列排序:
install.packages(c("usmap", "ggplot2", "dplyr")) library(usmap) library(ggplot2) library(dplyr) # 生成本土48州排名数据 state_rankings <- data.frame( state = c("AL", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"), ranking = runif(48, min = -2, max = 2) ) # 获取本土48州的多边形数据(剔除AK、HI) state_map <- us_map(regions = "states") %>% filter(!abbr %in% c("AK", "HI")) # 用left_join合并,保留原始顺序,再按order排序确保顶点正确 state_map_rankings <- left_join(state_map, state_rankings, by.x = "abbr", by.y = "state") %>% arrange(order) # 绘制地图 ggplot(state_map_rankings, aes(x = x, y = y, group = group, fill = ranking)) + geom_polygon(color = "black") + scale_fill_gradient2(low = "red", mid = "white", high = "green", midpoint = 0, limits = c(-2,2)) + theme_void() + theme(legend.position = "bottom") + coord_equal() # 保证地图比例正确,避免拉伸
关键说明
scale_fill_gradient2中添加limits = c(-2,2)可以确保颜色深浅严格对应-2到2的排名范围,即使样本数据没有触及边界值,颜色映射也会保持一致。coord_equal()用于保持地图的正确比例,避免图形被拉伸变形。
内容的提问来源于stack exchange,提问作者MOHAMMED
相关产品推荐
相关产品推荐

