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

