r - 使用ggplot2绘制具有多个子多边形和孔的SpatialPolygons

标签 r ggplot2 polygon geospatial broom

我想从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))

ggplot fill problem with SpatialPolygons with holes
(来源: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)))

enter image description here

关于r - 使用ggplot2绘制具有多个子多边形和孔的SpatialPolygons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140660/

相关文章:

r - 使用时间序列交叉验证模仿 createFolds

r - 在 dplyr 公式右侧使用动态变量

r - 如何按区域为 map 添加颜色?

r - 无法使用 R 将大型栅格转换为多边形

r - 如何为大量纬度/经度坐标绘制多边形并计算表面面积?

geometry - 将相邻矩形合并为多​​边形的算法

r - 如何从 R 中的单个向量创建二进制矩阵?

r - 如何在具有facets的组中添加一条最适合ggplot的线

r - 通过apply函数生成多个ggplot箱线图

r - 时钟中的时间显示,r 中的 xy 散点图