使用ggplot2绘制具有多个子多边形和孔的空间多边形 [英] Draw SpatialPolygons with multiple subpolygons and holes using ggplot2

查看:26
本文介绍了使用ggplot2绘制具有多个子多边形和孔的空间多边形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用ggplot2中的孔从库sp中绘制SpatialPolygons。 多亏了其他关于堆栈溢出的问题,我知道在处理顺时针写入的多边形时允许这样做:
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)

推荐答案

可能是"浏览"sf包的好时机。在ggplot中使用sf对象实际上要容易得多,这要归功于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)))

这篇关于使用ggplot2绘制具有多个子多边形和孔的空间多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆