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
相关产品推荐
相关产品推荐

