You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动