使用ggplot2创建指定范围世界地图并修正裁剪失真问题
问题
使用ggplot2的map_data("world")生成世界地图,通过scale_x_continuous()和scale_y_continuous()设置裁剪范围后,北非区域显示不准确。
指定范围:
ext <- data.frame(xmin = -10.57514, xmax = 37.21653, ymin = 29.68319, ymax = 73.22486)
原代码:
library(ggplot2) ggplot(map_data("world"), aes(long, lat)) + geom_polygon(aes(group = group), color = "white", fill = "lightgray", size = 0.2) + theme_void() + coord_fixed() + scale_x_continuous(limits = c(ext$xmin, ext$xmax)) + scale_y_continuous(limits = c(ext$ymin, ext$ymax))
原因
scale_x/y_continuous(limits = ...)仅作用于裁剪绘图显示区域,并未真正处理地理数据。当地图中的多边形(如北非国家)有部分超出设定的纬度下限时,ggplot会直接截断这些多边形的显示,导致多边形形状异常、区域缺失,最终显示不准确。
解决方法
需要先对地理数据进行空间裁剪,只保留指定范围内的部分,再进行绘图。推荐使用sf包处理空间数据,完整代码如下:
library(ggplot2) library(sf) # 定义裁剪范围 ext <- data.frame(xmin = -10.57514, xmax = 37.21653, ymin = 29.68319, ymax = 73.22486) # 创建用于裁剪的空间边界 crop_bbox <- st_bbox(c(xmin = ext$xmin, xmax = ext$xmax, ymin = ext$ymin, ymax = ext$ymax)) %>% st_as_sfc() # 将map_data的data.frame转换为sf空间对象 world_sf <- st_as_sf(map_data("world"), coords = c("long", "lat"), group = "group", crs = 4326) %>% st_cast("POLYGON") # 裁剪地图数据,仅保留边界内的部分 cropped_world <- st_crop(world_sf, crop_bbox) # 绘制裁剪后的地图 ggplot() + geom_sf(data = cropped_world, color = "white", fill = "lightgray", size = 0.2) + theme_void() + coord_sf(xlim = c(ext$xmin, ext$xmax), ylim = c(ext$ymin, ext$ymax), expand = FALSE)
关键说明
st_as_sf()将传统的data.frame格式地图数据转换为sf空间对象,支持专业的空间操作st_crop()会真正对地理多边形进行裁剪,移除范围外的部分,避免显示异常coord_sf()替代coord_fixed(),更适配空间数据的绘图需求,expand = FALSE确保地图边缘完全贴合设定范围
内容的提问来源于stack exchange,提问作者Esther
相关产品推荐
相关产品推荐

