我在使用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似乎忽略了空洞。除非是形状文件有问题。有什么建议可以诊断/修复此问题吗?