首页 > 解决方案 > 控制 n 个重叠区域的 alpha 混合/不透明度

问题描述

我很难理解(和控制)alpha 的混合——不幸的是,alpha 值不会简单地“加起来”(0.5 + 0.5 不是 1)。但我怎么能做到这一点?

目的是定义重叠区域相对于观察总数的(绝对)灰度值。请参见下面的示例。

我尝试设置scale_alpha(range = c(0,1))无济于事,也许我没有正确使用它。

library(ggplot2)
library(ggforce)

grid_df = data.frame(x = c(1:2, 2.5), y = rep(1,3), r = 1)

ggplot()+
geom_circle(data = grid_df, mapping = aes(x0 = x,  y0 = y, r = r), alpha = 0.33, fill = 'black') + 
  coord_fixed() 

在此处输入图像描述

标签: rggplot2alpha

解决方案


首先,对@JonSpring +1——这只是他们答案末尾的想法的扩展。如果你做一个sf对象,你可以很容易地得到多边形的交点。你最终绘制的不是圆圈本身,而是分割相交部分的多边形。

从您的网格开始,为每一行创建一个点,将其转换为sf数据框,然后在 column 中给定的半径处获取点的缓冲区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。默认情况下,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")


推荐阅读