如何修复R中plotly plot_geo()绘制多边形时填充整个地图的问题?
解决plot_geo绘制带孔洞的南非多边形时填充覆盖全图的问题
问题原因
plotly的plot_geo函数在处理带内环(孔洞)的多边形时,对拓扑结构和环的方向要求严格。南非的多边形因包含莱索托的孔洞,其拓扑格式不符合plot_geo的解析预期,导致填充范围错误。
解决方案
方案1:使用sf::st_remove_holes移除南非的孔洞
直接移除南非多边形中的孔洞,将其转为实心多边形,避免plot_geo解析错误:
library(plotly) library(tmap) library(sf) data(World) # 移除南非的孔洞,保留其他国家的原始几何结构 World_fixed <- World %>% mutate(geometry = if_else(name == "South Africa", st_remove_holes(geometry), geometry)) %>% st_as_sf() # 绘制地图 plot_geo(World_fixed, color = ~continent, showlegend = FALSE)
方案2:改用add_sf函数绘制(推荐)
plotly的add_sf对sf格式的空间对象支持更完善,能正确解析带孔洞的多边形,无需修改原始数据:
library(plotly) library(tmap) library(sf) data(World) # 使用add_sf替代plot_geo plot_ly() %>% add_sf(data = World, color = ~continent, showlegend = FALSE)
方案3:修复多边形拓扑结构
如果上述方法无效,可先修复所有多边形的拓扑错误,再调整环方向以适配plot_geo的要求:
library(plotly) library(tmap) library(sf) data(World) # 修复拓扑错误 World_valid <- st_make_valid(World) # 调整南非多边形的环方向 World_valid <- World_valid %>% mutate(geometry = if_else(name == "South Africa", st_reverse(geometry), geometry)) %>% st_as_sf() plot_geo(World_valid, color = ~continent, showlegend = FALSE)
内容的提问来源于stack exchange,提问作者Nijawi
相关产品推荐
相关产品推荐

