如何在R语言中使用rnaturalearth绘制带坐标点的世界地图?
解决方案
要把你的经纬度点绘制到Mollweide投影的世界地图上,核心是将普通经纬度数据转换为与底图同坐标系的sf对象,具体步骤如下:
1. 完善数据框(可选但推荐)
先把object列加入数据框,方便后续区分不同观测对象:
object = c("yacht", "fishingboat", "whale") long = c(-123.02676, -123.39763, -123.25103) lat = c(38.22033, 38.05059, 38.32280) df = data.frame(object, long, lat)
2. 转换数据格式并统一投影
你的底图已经转换为Mollweide投影(+proj=moll),需要把经纬度数据转为sf对象,并同步投影:
library(rnaturalearth) library(sf) library(ggplot2) # 创建并转换世界地图投影 world <- ne_countries(scale = "small", returnclass = "sf") %>% st_transform(crs = "+proj=moll") # 将普通经纬度转为sf点对象:先指定原始CRS为WGS84(EPSG:4326),再同步底图投影 df_sf <- st_as_sf(df, coords = c("long", "lat"), crs = 4326) %>% st_transform(crs = "+proj=moll")
3. 绘制带有点的世界地图
在ggplot中叠加底图和点,还可以添加颜色区分、文本标注增强可读性:
ggplot() + # 绘制世界地图底图,自定义填充和边框色 geom_sf(data = world, fill = "#f0f0f0", color = "#333333") + # 绘制观测点,按对象区分颜色,设置点大小 geom_sf(data = df_sf, aes(color = object), size = 3) + # 添加点的文本标注,微调位置避免遮挡 geom_sf_text(data = df_sf, aes(label = object), nudge_x = 5e5, nudge_y = 2e5) + theme_minimal() + # 设置图例标题 labs(color = "观测对象")
关键注意点
- 原始经纬度默认是WGS84坐标系(EPSG:4326),必须在
st_as_sf中明确指定,否则投影转换会出错 - 点的CRS必须与底图完全一致,否则点会出现在错误位置
- 可以根据需求调整点的大小、颜色、标注位置等参数
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

