如何设置重叠sf多边形的绘制顺序(无需转换为Spatial)
为sf对象按面积设置多边形绘制顺序(底层大、顶层小)
我有一组重叠的sf多边形,希望按面积从大到小的顺序绘制——最大的在底层,最小的在顶层。SpatialPolygons默认会通过@plotOrder插槽按面积降序设置绘制顺序,但如何在不转换为Spatial对象的情况下,为sf对象实现同样的效果?
以下是使用同一组多边形的Spatial和sf对象示例:
library(rtop) library(sf) rpath = system.file("extdata",package="rtop") obssf = st_read(rpath, "observations") obssp = as(obssf, "Spatial")
使用spplot绘制SpatialPolygons时,小多边形会在顶层,所有多边形都可见:
spplot(obssp, "QSUMMER_OB")
但使用plot()或ggplot2绘制sf对象时默认无法实现该效果:
plot(obssf[, "QSUMMER_OB"]) ggplot(obssf) + aes(fill = QSUMMER_OB) + geom_sf()
解决方案
方法1:Base R的plot()函数
核心逻辑是先计算每个多边形的面积,按面积降序排序(大的先绘制,处于底层),再绘制排序后的sf对象:
# 计算多边形面积并添加为新字段 obssf$area = st_area(obssf) # 按面积降序排序sf对象 obssf_sorted = obssf[order(-obssf$area), ] # 绘制排序后的多边形 plot(obssf_sorted[, "QSUMMER_OB"])
方法2:ggplot2
geom_sf()默认按数据框的顺序绘制,只需确保sf对象按面积降序排列即可,有两种写法:
写法1:先排序再绘制
library(ggplot2) # 按面积降序排序sf对象 obssf_sorted = obssf[order(-st_area(obssf)), ] # 绘制 ggplot(obssf_sorted) + aes(fill = QSUMMER_OB) + geom_sf()
写法2:在geom_sf中直接处理
library(ggplot2) ggplot(obssf) + aes(fill = QSUMMER_OB) + geom_sf(data = ~ .[order(-st_area(.)), ])
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

