【发布时间】:2017-10-23 18:02:54
【问题描述】:
我想从库sp 中画出SpatialPolygons,并在ggplot2 中有孔。
感谢其他关于 stackoverflow 的问题,我知道在处理顺时针书写的多边形时这是允许的:
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)
【问题讨论】:
-
一种解决方案是在 SpatialPolygons 函数调用中分离多边形。例如id = 2 的两个多边形变为 2a 和 2b。这是一种可能性,还是您正在寻找从 xy.sp.l 开始的解决方案。
标签: r ggplot2 polygon geospatial broom