ggplot2结合rnaturalearth绘制世界地图时coord_sf设置范围报错如何解决
问题产生原因
- 经纬度参数使用逗号作为小数点分隔符,R语言默认以英文句号
.作为小数点识别符,逗号会被视为向量元素分隔符,导致xlim、ylim传入的不是长度为2的合法数值向量,触发坐标解析异常。 coord_sf中设置了default_crs=NULL,导致ggplot无法统一geom_sf的sf对象坐标系与geom_point的普通经纬度坐标系,边界裁剪时发生几何类型转换错误。- 你设置的经度范围从-90.27到171.83,覆盖范围极广且接近国际日期变更线,实时裁剪sf对象时部分跨边界的GEOMETRYCOLLECTION类型几何无法正常转换格式,触发报错。
解决方法
方案1:直接修改原代码参数
- 先将经纬度参数的逗号替换为英文句号,保证R可以正常识别数值:
lat_max <- 57.92 lat_min <- -48.32 long_max <- 171.83 long_min <- -90.27
- 删除
coord_sf中冗余的default_crs=NULL参数即可,修改后的问题行代码如下:
coord_sf(xlim = c(long_min, long_max), ylim = c(lat_min,lat_max), expand = FALSE)
方案2:提前裁剪地图数据(更稳定,避免实时裁剪报错)
先对世界地图sf对象提前做裁剪,再传入ggplot绘图,代码如下:
library(sf) library(rnaturalearth) library(ggplot2) # 原始数据读取 worldmap <- ne_countries(returnclass = 'sf', scale='medium') lat_max <- 57.92 lat_min <- -48.32 long_max <- 171.83 long_min <- -90.27 # 提前按边界裁剪地图 worldmap_cropped <- st_crop(worldmap, st_bbox( c(xmin = long_min, xmax = long_max, ymin = lat_min, ymax = lat_max), crs = st_crs(worldmap) )) update_geom_defaults("point",list(size=1)) ggplot() + geom_sf(data = worldmap_cropped, fill= "#71c6a6",lwd=0) + geom_point( data= current_mapdata, aes(x=longitude, y=latitude) ) + coord_sf(expand = FALSE)
内容的提问来源于stack exchange,提问作者GregorPetterson
相关产品推荐
相关产品推荐

