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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:48:24