求2023年最新世界地图绘制推荐方案(替代rworldmap等遗留包)
当前推荐的R世界地图绘制方案(替代rworldmap/raster)
核心依赖包(均为当前维护的主流工具):
sf:空间数据处理标准库,替代旧版sp/rgdal/rgeos系列ggplot2:主流绘图框架,完美支持sf格式空间数据rnaturalearth:获取权威、更新的世界地图矢量数据(国家/大陆级别)terra:官方推荐的栅格数据处理工具,替代raster
1. (国家, 数值)格式数据绘图示例
步骤1:安装并加载依赖
install.packages(c("sf", "ggplot2", "rnaturalearth", "rnaturalearthdata")) library(sf) library(ggplot2) library(rnaturalearth)
步骤2:获取地图数据并合并用户数据
# 获取中等精度世界国家sf数据 world <- ne_countries(scale = "medium", returnclass = "sf") # 模拟用户的国家-数值数据 set.seed(123) user_data <- data.frame( country = sample(world$name, 50), value = runif(50, 0, 100) ) # 合并地图与数据(匹配国家名称) world_merged <- merge(world, user_data, by.x = "name", by.y = "country", all.x = TRUE)
步骤3:绘制地图(含投影、经纬线、红-绿配色)
ggplot() + # 绘制国家多边形,绑定数值到填充色 geom_sf(data = world_merged, aes(fill = value), color = "white", linewidth = 0.1) + # 红-绿渐变配色,缺失值设为浅灰 scale_fill_gradient(low = "green", high = "red", na.value = "gray90") + # 设置罗宾逊投影(适合世界地图的无偏投影) coord_sf(crs = "+proj=robin") + # 显示经纬线网格 theme_minimal() + labs(fill = "指标数值", title = "世界国家指标分布图") + theme( panel.grid.major = element_line(color = "gray80", linetype = "dashed"), axis.text = element_text(size = 8) )
2. (纬度, 经度, 数值)网格点数据绘图示例(支持平滑/插值)
方案A:ggplot平滑热力图(快速可视化)
# 模拟网格点数据 set.seed(456) grid_data <- data.frame( lon = runif(1000, -180, 180), lat = runif(1000, -60, 80), value = rnorm(1000, 50, 20) ) # 绘制叠加底图的平滑热力图 ggplot() + # 世界地图底图 geom_sf(data = world, fill = "gray90", color = "white", linewidth = 0.1) + # 平滑处理点数据,生成热力层 stat_density2d(data = grid_data, aes(x = lon, y = lat, fill = stat(density)), geom = "raster", contour = FALSE, alpha = 0.7) + # 红-蓝渐变配色 scale_fill_gradient(low = "blue", high = "red") + # 设置温克尔三重投影 coord_sf(crs = "+proj=wintri") + theme_minimal() + labs(fill = "数据密度", title = "网格点数据平滑分布图") + theme( panel.grid.major = element_line(color = "gray80", linetype = "dashed"), axis.text = element_text(size = 8) )
方案B:terra插值栅格(专业空间插值)
install.packages("terra") library(terra) # 将点数据转为terra矢量对象 point_vec <- vect(grid_data, geom = c("lon", "lat")) # 创建1°分辨率的空栅格模板 empty_raster <- rast(point_vec, res = 1) # IDW插值生成连续栅格 interp_raster <- interpolate(empty_raster, point_vec, method = "idw") # 转为sf格式适配ggplot interp_sf <- st_as_sf(interp_raster) # 绘图 ggplot() + geom_sf(data = world, fill = "gray90", color = "white", linewidth = 0.1) + geom_sf(data = interp_sf, aes(fill = value), alpha = 0.7) + scale_fill_gradient(low = "blue", high = "red", na.value = NA) + coord_sf(crs = "+proj=robin") + theme_minimal() + labs(fill = "插值数值", title = "网格点数据插值分布图") + theme( panel.grid.major = element_line(color = "gray80", linetype = "dashed") )
关键功能设置说明
投影选择
常用世界地图投影(可直接填入coord_sf(crs = ...)):
- 罗宾逊投影:
"+proj=robin"或EPSG:54030(无面积/形状偏误,适合世界概览) - 温克尔三重投影:
"+proj=wintri"(平衡面积、形状、距离误差) - 等距圆柱投影:
"+proj=eqc"(经纬线正交,适合需要准确经纬度的场景)
经纬线显示
通过theme()中的panel.grid.major参数控制,示例中已设置为灰色虚线;若需显示经纬线刻度,确保axis.text不为空即可。
入门指引与文档
可通过R内置命令查看官方vignette:
sf空间数据基础:vignette("sf")ggplot2空间绘图:vignette("sf")(含ggplot2与sf结合的用法)rnaturalearth数据获取:vignette("rnaturalearth")terra栅格处理:vignette("terra")
内容的提问来源于stack exchange,提问作者ivo Welch
相关产品推荐
相关产品推荐

