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

R语言制作Robinson投影等值线图异常问题求助

解决R语言Robinson投影全球等值线图异常问题

问题根源

你犯了双重投影转换的错误:先将WGS84的sf数据转换为ESRI:54030(Robinson投影),之后又在coord_sf()中再次指定Robinson投影参数,导致坐标系重复转换,出现异常。

两种修正方案

方案1:直接在ggplot中通过coord_sf指定投影(推荐)

不需要提前转换sf数据的坐标系,保留原始WGS84,让ggplot自动处理投影转换:

# 加载所需包
library(ggplot2)
library(sf)
library(data.table)

# 假设你的数据:sf_world(WGS84的世界边界),dt_mean(含国家ID和均值的data.table)
# 合并数据
sf_world_merged <- merge(sf_world, dt_mean, by = "country_id", all.x = TRUE)

# 绘制地图
ggplot(sf_world_merged) +
  geom_sf(aes(fill = mean_value)) + # 国家均值填充用fill,若需线条用color
  coord_sf(crs = "+proj=robin +lon_0=0") + # 直接指定Robinson投影,lon_0=0无需加w
  scale_fill_viridis_c(option = "plasma") + # 可选:美观的颜色映射
  theme_minimal()

方案2:提前转换sf数据到Robinson投影,ggplot中不重复指定

如果需要提前处理投影,转换后直接绘图,不要在coord_sf()中再设置crs:

# 转换sf数据到Robinson投影(ESRI:54030等价于+proj=robin +lon_0=0)
sf_world_robin <- st_transform(sf_world, crs = "ESRI:54030")

# 合并数据
sf_world_merged <- merge(sf_world_robin, dt_mean, by = "country_id", all.x = TRUE)

# 绘制地图(无需再指定coord_sf的crs)
ggplot(sf_world_merged) +
  geom_sf(aes(fill = mean_value)) +
  scale_fill_viridis_c(option = "plasma") +
  theme_minimal()

额外注意事项

  • 确认dt_mean和sf_world的匹配字段(比如国家名称或ID)无拼写错误,避免合并后出现缺失值导致的地图漏洞。
  • lon_0=0w写法冗余,直接用lon_0=0即可,WGS84下经度0就是本初子午线。
  • 若你实际需要绘制的是**栅格等值线(contour)**而非国家填充图,需先将点数据插值为栅格,再完成投影转换后绘制,但根据描述,国家均值用geom_sf(aes(fill=...))的填充地图更合适。

内容的提问来源于stack exchange,提问作者MoonS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:21:57