用 geom_polygon 绘制带孔的 ggplot 多边形

Plot ggplot polygons with holes with geom_polygon

关于 ggplot2 无法绘制具有 个孔 .

的多边形的事实,有 questions

这是因为,如果点的顺序不对,最后的图看起来很糟糕,通常在甜甜圈形状内有clipping/trimming条线。

我已经阅读了很多关于顺序的重要性,但我无法向前迈进。 我有一个具有 26 个特征的 SpatialPolygonsDataFrame(来自 raster::rasterToPolygons(dissolve=T)),我想用 ggplot.

绘制它

事情是这样的 -

r3.pol <- rasterToPolygons(r3, dissolve=T)
r3.df <- fortify(r3.pol)
names(r3.df) <- c('x','y','order','hole','piece','ID','group')
p <- ggplot(r3.df)
p <- p + geom_polygon(mapping=aes(x=x,y=y,group=ID), fill='red')
p <- p + coord_equal()

我看到这个输出:

虽然应该是这样,但是 plot(r3.pol):

我怎样才能完成这项工作? 我尝试了几个小时,但无法重新订购 r3.df。 另外,r3.df$hole 中的信息对您有帮助吗?它由函数 fortify 返回,用于点是孔(我认为)。

附带问题:如何将我的 r3.pol SpatialPolygonsDataFrame 提供给您,以便您自己尝试?我记得在这里看到过长的、可复制的 "dumps" 对象,但我不知道该怎么做。

saved 多边形数据框 here。无法使用 dput 保存它,抱歉。您可以使用 load.

获取它

我的临时解决方案是:@#$%个多边形,并使用raster包。

即:

r <- raster(x=extent(r3.pol), crs=crs(r3.pol)) # empty raster from r3.pol
res(r) <- 250 # set a decent resolution (depends on your extent)
r <- setValues(r, 1) # fill r with ones
r <- mask(r, r3.pol) # clip r with the shape polygons

现在绘制它,就像使用任何 rasterggplot 一样。 rasterVis 包在这里可能会有帮助,但我没有使用它,所以:

rdf <- data.frame(rasterToPoints(r))
p <- ggplot(rdf) + geom_raster(mapping=aes(x=x, y=y), fill='red')
p <- p + coord_equal()

到此为止。

或者,您可以使用 rasterize 创建光栅,这样光栅将保存多边形值(在我的例子中,只是一个整数):

r <- raster(x=extent(r3.pol), crs=crs(r3.pol))
res(r) <- 250
r <- rasterize(r3.pol, r)

rdf <- data.frame(rasterToPoints(r))
p <- ggplot(rdf) + geom_raster(mapping=aes(x=x, y=y, fill=factor(layer)))
p <- p + coord_equal()

如果有人为 geom_polygon 提出了一个不错的解决方案,可能涉及重新排序多边形数据框,我会很乐意考虑。

我建议安装软件包 "ggpolypath" 并使用 geom_polypath 而不是 geom_polygon。适合我。