用 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" 对象,但我不知道该怎么做。
我 save
d 多边形数据框 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
现在绘制它,就像使用任何 raster
和 ggplot
一样。 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。适合我。
关于 ggplot2
无法绘制具有 个孔 .
这是因为,如果点的顺序不对,最后的图看起来很糟糕,通常在甜甜圈形状内有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" 对象,但我不知道该怎么做。
我 save
d 多边形数据框 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
现在绘制它,就像使用任何 raster
和 ggplot
一样。 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。适合我。