【问题标题】:ggplot omits polygon holesggplot 省略了多边形孔
【发布时间】:2016-10-23 10:40:46
【问题描述】:

我很难让 ggplot 绘制具有孔洞的多边形。下面演示。首先使用git clone https://github.com/geotheory/volcano 获取shapefile。下一个:

require(ggplot2); require(ggmap); require(dplyr); require(maptools)
v = readShapePoly('volcano/volcano.shp')
v@proj4string = CRS('+proj=longlat +datum=WGS84')

# confirm polygons spatially exclusive (don't overlap)
plot(t(bbox(v)), type='l', lwd=8)
plot(v, col=paste0(colorRampPalette(c('grey','red'))(8),'dd'), add=T)

看起来不错。如果被多个多边形遮挡,dd alpha 应该使线不可见。现在让我们在 ggplot 中尝试一下。

d = fortify(v) %>% as_data_frame()
bb = bbox(v)
toner = get_stamenmap(c(bb[1,1], bb[2,1], bb[1,2], bb[2,2]), zoom=11, maptype='toner')
ggmap(toner) + geom_polygon(data=d, aes(long, lat, group=group, fill=id), alpha=.5)

中心多边形必须重叠,因为底层地图在中心完全被遮挡。让我们检查强化数据是否存在漏洞:

d %>% select(id, hole) %>% table()
   hole
id  FALSE TRUE
  0   278    0
  1   715    0
  2   392  388
  3   388  331
  4   390  265
  5   265  387
  6   328  125
  7   125    0

看起来不错,所以让我们尝试将它们分别可视化。

i = 3
plot(v[i,], col='red') 
ggplot(filter(d, id == i-1)) + geom_polygon(aes(long, lat, group=group, col=hole), fill=NA)
ggplot() + geom_polygon(data=filter(d, id==i-1), aes(long,lat, group=group))

似乎出了点问题。 ggplot 似乎忽略了这些漏洞。除非它是 shapefile 的问题。有什么建议如何诊断/解决这个问题?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    "hadley/ggplot2: plotting polygon shapefiles"“...,孔状态被保留,但 ggplot2 不使用此信息”。还好ggspatial包,"Fish & Whistle: Holes in ggplot polygons"教我,好像解决了一些问题,比如重叠问题。 (“Biggin Hill”标签上方的白色区域不是由于ggspatial 包,因为它也在我的环境中的ggplot(d) + geom_polygon(aes(long, lat, group = group, fill = id)) 上)

    devtools::install_github("paleolimbot/ggspatial")
    
    library(ggspatial)
    
    ggmap(toner) + geom_spatial(data=v, aes(fill=id), alpha=.8)
    

    【讨论】:

      【解决方案2】:

      我在世界地图上与莱索托国家有同样的问题。通常,ggplot2 应该检测到孔,因为多边形的感觉是反向的(如果我记得,逆时针而不是顺时针)。

      这里的解决方案似乎从选择中删除了这个洞。

      colorsbrewer_red <-  c( "#fff5f0","#fee0d2", "#fcbba1","#fc9272", "#fb6a4a", "#ef3b2c", "#cb181d",  "#99000d")
      
      ggmap(toner) +  
      geom_polygon(data=d[!d$hole,], aes(long, lat, group=group, fill=id), alpha=.5) +
        scale_fill_manual(name = "",
                          values= colorsbrewer_red,
                          na.value = "# 808080",
                          drop=FALSE)
      

      无论如何,如果有人知道如何直接处理geom_polygon 中的漏洞,那就太好了。

      【讨论】:

      • 谢谢@timat。对我来说仍然是个问题,因为我需要孔,否则多边形重叠并且底层地图被遮盖了..
      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 2010-09-26
      • 2011-10-14
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多