在R中使用ggmap绘制多边形报错的解决方案咨询
解决ggmap绘制多边形时的"non-numeric argument for binary operator"错误
嘿,我来帮你搞定这个报错!你遇到的这个问题核心原因是传统的sp地理对象和ggmap/ggplot2的语法不兼容——ggplot2更适配data.frame或者sf(Simple Features)格式的数据,直接扔sp对象进去就会触发类型不匹配的错误。下面给你两个靠谱的解决方案:
方案1:转成sf对象(推荐,现在R地理数据处理的主流格式)
sf和ggplot2的兼容性拉满,操作也更简洁:
# 先装sf包(没装的话跑这个:install.packages("sf")) library(sf) library(ggmap) # 直接用sf包读取geojson,一步得到兼容格式 data_sf <- st_read("/home/jan/Downloads/map.geojson") # 根据你的多边形范围自动获取底图 bbox <- st_bbox(data_sf) map_base <- get_map( location = c(left = bbox[1], bottom = bbox[2], right = bbox[3], top = bbox[4]), maptype = "terrain", # 可以换成roadmap/satellite等 zoom = 10 # 根据你的区域大小调整 ) # 把底图和多边形叠在一起画 ggmap(map_base) + geom_sf(data = data_sf, inherit.aes = FALSE, fill = "red", alpha = 0.3, color = "black")
方案2:把sp对象转成data.frame(适合不想换包的情况)
如果你不想用sf,也可以用fortify()把sp对象转成ggplot能识别的data.frame:
library(ggplot2) library(ggmap) library(maptools) # 保留你原来的sp对象读取代码 data_json <- geojson_read("/home/jan/Downloads/map.geojson", what = "sp") # 把sp对象转成带经纬度的data.frame data_df <- fortify(data_json) # 根据sp对象的边界获取底图 bbox <- bbox(data_json) map_base <- get_map( location = c(left = bbox[1], bottom = bbox[2], right = bbox[3], top = bbox[4]), maptype = "roadmap", zoom = 12 ) # 绘制多边形 ggmap(map_base) + geom_polygon(data = data_df, aes(x = long, y = lat, group = group), fill = "blue", alpha = 0.4, color = "darkblue")
为啥会报错?
你原来的代码里直接把sp对象往ggplot图层里塞,但ggplot的图层函数(比如geom_polygon)需要的是明确包含long(经度)、lat(纬度)列的data.frame,sp对象的结构完全不符合这个要求,所以就触发了“非数值参数用于二元运算符”的错误——说白了就是ggplot读不懂sp对象里的坐标数据。
另外提个小提醒:现在ggmap的get_map()需要Google Maps API密钥才能正常用,如果底图加载失败,记得先去申请密钥,然后用ggmap::register_google(key = "你的密钥")注册一下。
内容的提问来源于stack exchange,提问作者JaElf
相关产品推荐
相关产品推荐

