我希望在 ggplot2 中使用 sp 库中的 SpatialPolygons 函数绘制具有孔洞的图形。感谢 Stack Overflow 上其他用户的问题,我知道处理顺时针多边形时可以这样做:
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
实际上,在使用 broom::tidy(替换 ggplot2::fortify)转换 SpatialPolygons 时,孔洞多边形按顺时针方向保存以便作为孔洞绘制。
在 ggplot2 中,绘制具有孔洞的多边形需要用 fill 和 colour 分别绘制两次,否则可能会看到线穿过多边形。当处理包含多个子多边形和孔洞的情况时,这更加棘手,由 broom::tidy 定义的点特征顺序可能不允许填充多边形(见下面的图像)。您们有没有什么解决办法来解决这个填充问题?
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
实际上,在使用 broom::tidy(替换 ggplot2::fortify)转换 SpatialPolygons 时,孔洞多边形按顺时针方向保存以便作为孔洞绘制。
在 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)