You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置重叠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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:43:09