我想从ggplot2中带有孔的库SpatialPolygons
绘制sp
。
感谢其他有关stackoverflow的问题,我知道在处理顺时针书写的多边形时可以这样做:
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
实际上,当使用SpatialPolygons
转换broom::tidy
(替换ggplot2::fortify
)时,孔多边形将按顺时针方向保存,以绘制为孔。
在ggplot2中,绘制带孔多边形的方式会强制使用fill
绘制一次,然后使用colour
绘制一次,否则您可能会看到与多边形交叉的线。
当处理多个子多边形(有些带有孔)时,这比较棘手,由broom::tidy
定义的点要素的顺序可能不允许填充多边形(请参见下图)。
你们中的任何人都有解决此填充问题行为的解决方案吗?
这是一个可重现的示例:
library(sp)
library(ggplot2)
# Create two polygons: second would be a hole inside the first
xy = cbind(
x = c(13.4, 13.4, 13.6, 13.6, 13.4),
y = c(48.9, 49, 49, 48.9, 48.9)
)
hole.xy <- cbind(
x = c(13.5, 13.5, 13.45, 13.45, 13.5),
y = c(48.98, 48.92, 48.92, 48.98, 48.98)
)
# Transform as SpatialPolygons with holes
xy.sp <- SpatialPolygons(list(
Polygons(list(Polygon(xy),
Polygon(hole.xy, hole = TRUE)), "1"),
Polygons(list(Polygon(xy + 0.2),
Polygon(xy + 0.35),
Polygon(hole.xy + 0.2, hole = TRUE)), "2")
))
# Transform SpatialObject to be used by ggplot2
xy.sp.l <- broom::tidy(xy.sp)
ggplot(xy.sp.l) +
geom_polygon(aes(x = long, y = lat, group = id, fill = id))
(来源:statnmap.com)
最佳答案
可能是“遍历” sf
包的好时机。实际上,由于sf
的几何结构,在ggplot
中使用geom_sf
对象要容易得多:
library("sf")
library("rgeos")
sf_poly <- as(xy.sp, "sf")
sf::st_crs(sf_poly) <- 4326
sf_poly$id <- c(1,2)
ggplot(sf_poly) +
geom_sf(aes(fill = as.factor(id)))
关于r - 使用ggplot2绘制具有多个子多边形和孔的SpatialPolygons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140660/