Ggplot绘制丹麦首都大区地图时飞地着色错误问题求助
解决Frederiksberg Kommune被哥本哈根多边形覆盖的地图绘制问题
嘿,你的推测完全正确!之所以Frederiksberg的填充色没显示出来,就是因为ggplot是按照数据框里的顺序绘制图层的——先出现的多边形会被后出现的覆盖。而你看到的轮廓还在,是因为每个多边形都单独绘制了白色边框,Frederiksberg的边框并没有被完全盖住。
你想的“重新绘制Frederiksberg覆盖在上方”这个思路完全可行,而且是最直接的解决方案之一。下面给你两种具体的实现方法:
方法1:单独绘制Frederiksberg图层
在绘制完所有Kommune之后,单独添加一个只包含Frederiksberg的geom_polygon图层,这样它就会被放在最上层,覆盖在哥本哈根的多边形之上:
ggplot(data = combmapscaled %>% filter(!(kommuner == "Christiansø" | (kommuner == "Halsnæs" & lat > 6220000)))) + # 先绘制所有Kommune基础图层 geom_polygon(aes(x = long, y = lat, fill = factor(kommuner), group = group), color = "white") + # 单独绘制Frederiksberg,确保在最上层 geom_polygon( data = combmapscaled %>% filter(kommuner == "Frederiksberg"), aes(x = long, y = lat, fill = factor(kommuner), group = group), color = "white" ) + coord_fixed(1)
另外,注意到你的数据里已经有komcolours列,直接用它作为填充色会更稳定,避免factor排序可能带来的颜色偏差,把fill = factor(kommuner)改成fill = komcolours即可。
方法2:调整数据框的绘制顺序
如果不想多写一个图层,也可以调整数据框的顺序,把Frederiksberg的行放在最后。ggplot会按数据顺序绘制,最后出现的多边形会覆盖之前的:
# 先过滤掉不需要的区域,再把Frederiksberg移到最后 adjusted_map_data <- combmapscaled %>% filter(!(kommuner == "Christiansø" | (kommuner == "Halsnæs" & lat > 6220000))) %>% arrange(kommuner != "Frederiksberg") # 让Frederiksberg排在最后 ggplot(data = adjusted_map_data) + geom_polygon(aes(x = long, y = lat, fill = factor(kommuner), group = group), color = "white") + coord_fixed(1)
两种方法都能解决你的问题,方法1更直观,适合需要单独调整某个区域样式的场景;方法2更简洁,适合只需要调整绘制顺序的情况。
内容的提问来源于stack exchange,提问作者Jens Munk
相关产品推荐
相关产品推荐

