You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:01:17