首先,+1 给@JonSpring——这只是他们答案末尾的想法的扩展。如果你做了一个sf
对象,您可以轻松获得多边形的交集。您最终绘制的不是圆本身,而是将相交的部分分开后形成的多边形。
从网格开始,为每一行指定一个点,将其转换为sf
数据帧,然后获取列中给出的半径处的点的缓冲区r
。这会将每个点变成以该点坐标为中心的圆,并且对于不同的半径是灵活的。 3 个圆之间有 6 个相交的多边形,如结果所示。
library(dplyr)
library(sf)
library(ggplot2)
library(ggforce)
grid_df <- data.frame(x = c(1:2, 2.5), y = rep(1,3), r = 1)
grid_sf <- grid_df %>%
mutate(geometry = purrr::map2(x, y, ~st_point(c(.x, .y)))) %>%
st_as_sf() %>%
st_buffer(dist = .$r, nQuadSegs = 60) %>%
st_intersection()
grid_sf
#> Simple feature collection with 6 features and 5 fields
#> geometry type: GEOMETRY
#> dimension: XY
#> bbox: xmin: 0 ymin: 0 xmax: 3.5 ymax: 2
#> epsg (SRID): NA
#> proj4string: NA
#> x y r n.overlaps origins geometry
#> 1 1.0 1 1 1 1 POLYGON ((1.5 0.1339746, 1....
#> 1.1 1.0 1 1 2 1, 2 POLYGON ((1.75 0.3386862, 1...
#> 2 2.0 1 1 1 2 MULTIPOLYGON (((2.258819 0....
#> 1.2 1.0 1 1 3 1, 2, 3 POLYGON ((2 1, 1.999657 0.9...
#> 2.1 2.0 1 1 2 2, 3 POLYGON ((3 1, 2.999657 0.9...
#> 3 2.5 1 1 1 3 MULTIPOLYGON (((3.5 1, 3.49...
用那个n.overlaps
来自的列st_intersection
分配阿尔法。默认情况下,alpha 会从 0 缩放到 1,但我认为您实际上并不需要圆的外部非重叠部分使用 0 alpha,因此我对其进行缩放以获得最小 alpha。
alpha_range <- range(grid_sf$n.overlaps) / max(grid_sf$n.overlaps)
grid_sf %>%
ggplot() +
geom_sf(aes(alpha = n.overlaps), fill = "black") +
scale_alpha(range = alpha_range)
只是为了进一步扩展并使不同的多边形更加清晰,请使用离散填充比例而不是 alpha 进行查看:
grid_sf %>%
ggplot() +
geom_sf(aes(fill = as.factor(n.overlaps))) +
scale_fill_brewer(palette = "YlGnBu")