如何用ggplot按变量填充Shapefile地图?美国薪资填图报错求助
问题解决:美国地图薪资填充的美学长度不匹配错误
嘿,我来帮你搞定这个地图填充的问题!你遇到的错误核心原因是美学映射的用法不对,还有一个小语法错误,我一步步给你拆解:
错误原因分析
你之前的代码里,把fill = PlotData$MeanSalary直接写在了geom_polygon()的参数里,这会让ggplot误以为每个地图坐标点(也就是Shapefile里的每一行数据,总共2834334行)都需要一个单独的填充值,但你的MeanSalary只有4个州的数值,长度完全不匹配,所以才会抛出那个错误。
另外,你原代码里的mapping=(aes(...)多了一个左括号,这也是个语法小问题,得修正。
修正后的代码
正确的做法是把fill映射放到aes()内部,让ggplot自动根据你指定的group(每个州的多边形组)来关联对应的薪资数值,这样同一个州的所有多边形区域会自动使用同一个薪资对应的颜色:
library(tidyverse) library(rgdal) # 读取Shapefile(确保你的工作目录里有usamap相关文件) map <- readOGR(dsn = ".", layer = "usamap") # 合并空间数据和薪资数据 PlotData <- merge(map, data, by = "State") # 绘制带薪资填充的地图 map_base <- ggplot(data = PlotData, mapping = aes(x = long, y = lat, group = group, fill = MeanSalary)) + geom_polygon(color = "black") + # 这里不需要再写fill=NA,aes里已经指定了填充映射 scale_fill_continuous(name = "平均薪资") # 可选:给颜色刻度加个清晰的名称 # 显示地图 map_base
额外优化建议
如果你想让颜色更美观,比如用对色盲用户更友好的色阶,可以把scale_fill_continuous()换成scale_fill_viridis_c(option = "plasma", name = "平均薪资"),视觉效果会更好。
另外提一句:rgdal包现在已经处于维护状态,推荐你以后用sf包来处理空间数据,代码会更简洁,比如用st_read()代替readOGR(),处理空间数据的逻辑也更直观~
内容的提问来源于stack exchange,提问作者skipndipp




