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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11