使用geom_polygon绘制带有孔洞的ggplot多边形

4

问题关于ggplot2不能绘制具有空洞的多边形形状。

这是因为,如果点的顺序不正确,最终的图形看起来很糟糕,通常在甜甜圈形状内部会出现剪切/修剪线。

我已经阅读了很多关于顺序的重要性的文章,但我无法迈出下一步。我有一个包含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()

我看到这个输出:

enter image description here

虽然应该是这样的,使用 plot(r3.pol)

enter image description here

我该如何让这个工作呢?我尝试了几个小时,但我无法重新排序r3.df。此外,r3.df$hole中的信息是否有用?它是由函数fortify返回的,用于表示孔洞(我想是这样的)。
附带问题:我如何将我的r3.pol SpatialPolygonsDataFrame传给你,以便您可以自己尝试一下?我记得在这里看到过对象的长、可重复的"转储",但我不知道如何做。
我在这里保存了多边形数据框。我无法使用dput保存它,抱歉。您可以使用load获取它。

1
你不需要提供整个数据框。只需提供一个包含几个独立多边形的小样本即可。将 dput(dataSample) 的输出粘贴到你的问题中。 - eipi10
@eipi10 就是这样!但我在使用它时遇到了一些麻烦。它似乎不能用于 SpatialPolygonsDataFrame 上。而且,即使我对 r3.df 进行了子采样,仍然会产生巨大的转储。我想我会使用一些现成的日志提供程序。 - natario
我会建议放弃使用ggplot2来绘制地图,而是使用tmap包——它可以处理空洞,不再需要对所有内容进行“加固”。 - Spacedman
2个回答

4

我建议安装“ggpolypath”包并使用geom_polypath代替geom_polygon。这对我很有效。


2
我的临时解决方案是:@#$% 多边形,使用 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

现在按照你通常使用ggplot绘制raster的方式来绘制它。这里可能会用到rasterVis包,但我没有使用它,所以:
rdf <- data.frame(rasterToPoints(r))
p <- ggplot(rdf) + geom_raster(mapping=aes(x=x, y=y), fill='red')
p <- p + coord_equal()

这就开始了。

enter image description here

或者,您可以使用 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()

enter image description here

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接