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

使用R的ggplot与mapdata绘制荷兰地图出现多边形重叠问题求助

荷兰地图绘制多边形重叠问题分析与解决

问题重现

用ggplot2和mapdata绘制荷兰地图时,出现了多边形重叠的情况(如图),需要分析原因并实现仅显示一层多边形。

用到的代码:

we=map_data(map = "world", region = c("Netherlands"))
ggplot()+
  geom_polygon(data =we, aes(x=long, y=lat, group=group), fill = "red", color = "white",size=0.2,alpha=0.4)+
  theme(
    plot.margin = unit(c(0,0,0,0), "cm"),
    legend.title = element_blank(),
    legend.margin=margin(),
    legend.position = "bottom",
    strip.background = element_blank(),
    panel.background = element_rect(fill = "white",
                                colour = "white",
                                size= 0.5),
    panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    axis.ticks.x = element_blank(),
    axis.text.x = element_blank(),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank())

荷兰地图重叠效果

问题原因

  • 地图数据包含多区域:mapdata的world数据集里,Netherlands不仅包含荷兰本土,还附带了它的海外领地(比如加勒比地区的小岛),同时本土本身也被拆分为多个独立多边形(像岛屿、围海造田地块)。
  • 透明度放大视觉效果:你设置了alpha=0.4,多个多边形叠加时,透明度叠加会让重叠区域颜色变深,进一步凸显了重叠问题。
  • 数据可能存在重复记录:部分区域的边界多边形可能被重复存储,导致绘制时重复渲染。

解决办法

办法1:只保留荷兰本土

通过经纬度范围筛选出荷兰本土(大致在东经3°-7°,北纬50°-54°之间):

library(ggplot2)
library(mapdata)

we <- map_data(map = "world", region = c("Netherlands"))
# 筛选本土区域
we_nl_main <- subset(we, long >= 3 & long <= 7 & lat >= 50 & lat <= 54)

ggplot()+
  geom_polygon(data = we_nl_main, aes(x=long, y=lat, group=group), 
               fill = "red", color = "white", size=0.2, alpha=0.4)+
  theme(
    plot.margin = unit(c(0,0,0,0), "cm"),
    legend.title = element_blank(),
    legend.margin=margin(),
    legend.position = "bottom",
    strip.background = element_blank(),
    panel.background = element_rect(fill = "white", colour = "white", size= 0.5),
    panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    axis.ticks.x = element_blank(), axis.text.x = element_blank(),
    axis.ticks.y = element_blank(), axis.text.y = element_blank(),
    axis.title = element_blank())

办法2:使用更精准的地图数据

换用rnaturalearth包获取规范的国家边界数据,该包的数据不会包含冗余多边形:

library(ggplot2)
library(rnaturalearth)
library(rnaturalearthdata)

# 获取荷兰边界数据(sf格式)
nl <- ne_countries(country = "netherlands", returnclass = "sf")

ggplot() +
  geom_sf(data = nl, fill = "red", color = "white", size=0.2, alpha=0.4) +
  theme(
    plot.margin = unit(c(0,0,0,0), "cm"),
    legend.title = element_blank(),
    legend.margin=margin(),
    legend.position = "bottom",
    strip.background = element_blank(),
    panel.background = element_rect(fill = "white", colour = "white", size= 0.5),
    panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    axis.ticks.x = element_blank(), axis.text.x = element_blank(),
    axis.ticks.y = element_blank(), axis.text.y = element_blank(),
    axis.title = element_blank())

办法3:去除重复多边形

如果是数据重复导致的重叠,直接按坐标和分组字段去重:

# 按long、lat、group列去重
we_unique <- we[!duplicated(we[c("long", "lat", "group")]), ]

ggplot()+
  geom_polygon(data = we_unique, aes(x=long, y=lat, group=group), 
               fill = "red", color = "white", size=0.2, alpha=0.4)+
  # 主题代码与之前一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:45:45