ggplot2绘制英国地震点位报错:如何解决地图叠加点位异常
问题分析与解决方案
你的两个错误都是ggplot2的美学映射继承逻辑和固定属性设置方式导致的,咱们一步步拆解解决:
错误1:Error: Aesthetics must be either length 1 or the same as the data (990): x, y
这个问题出在你把固定样式(colour="red"和size=2)放进了aes()里。aes()的核心作用是把数据列映射到可视化属性(比如后续要做的震级对应点大小),而统一的颜色、固定尺寸这类静态样式,应该直接作为geom_point()的参数,放在aes()外面。
当你把colour="red"塞进aes()时,ggplot会把它当成一个变量名,试图在你的table数据集里找名为red的列——显然不存在,于是它会把这个字符串当作长度为1的分组变量,和你的25行数据长度不匹配(或者和基础地图的990行数据混淆),最终触发报错。
错误2:Error in FUN(X[[i]], ...) : object 'group' not found
这个错误源于ggplot的美学继承机制:你的基础地图uk在aes()里设置了group=group(用来给多边形分组,保证英国地图正确绘制),而geom_point()默认会继承父图层的所有美学映射。当你用table数据绘制点时,ggplot会自动尝试在table里找group列,但你的数据集里根本没有这个字段,自然会报错。
修复后的完整代码
我调整了两处关键问题,同时提前帮你实现了「震级对应点大小」的需求:
library(ggplot2) library(maps) # 你的地震数据集 table <- data.frame( long2 = c(-2.62, 1.94, -0.24, -2.34, -3.16, -0.24, -4.11, -0.24, -0.24, -5.70, -2.40, -1.19, -1.02, -4.24, -3.23, -2.06, 1.63, -5.24, -5.86, -3.22, -0.24, -0.24, -4.01, -5.18, -1.95), lat2 = c(52.84, 57.03, 51.16, 53.34, 55.73, 51.16, 53.03, 51.16, 51.16, 57.08, 53.00, 53.35, 53.84, 52.62, 54.24, 52.62, 54.96, 56.05, 55.84, 54.23, 51.16, 51.16, 55.92, 50.08, 54.44), mag1 = c(1.9, 4.2, 0.6, 0.8, 2.0, 1.0, 1.5, 0.2, 1.1, 1.6, 1.4, 1.2, 1.7, 0.8, 0.3, 1.0, 1.7, 0.7, 1.3, 0.3, -1.4, -0.7, 0.3, 2.3, 1.0) ) # 生成英国地图多边形数据 w <- map_data("world", region = "uk") # 绘制基础英国地图 uk <- ggplot(data = w, aes(x = long, y = lat, group = group)) + geom_polygon(fill = "seagreen2", colour = "white") + coord_map() # 添加地震点位(修复后的核心代码) uk + geom_point( data = table, aes(x = long2, y = lat2, size = mag1), # 仅保留数据映射的美学(震级对应点大小) colour = "red", # 固定颜色移到aes()外 position = "jitter", alpha = 0.5, inherit.aes = FALSE # 禁止继承父图层的group等无关美学 ) + labs(size = "震级") # 给大小图例添加清晰标签
额外小提示
- 如果你不想用
inherit.aes=FALSE,也可以在geom_point()的aes()里显式写group=NULL,同样能避免继承父图层的group映射 - 你的数据里有几个负的震级值(比如-1.4),如果是录入错误建议提前清洗,否则对应的点会非常小甚至难以观察
内容的提问来源于stack exchange,提问作者HappyDinosaur
相关产品推荐
相关产品推荐

