设置相对于n的重叠区域的灰度值的不透明度

Tje*_*ebo 7 alpha r ggplot2

我很难理解(和控制)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() 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

cam*_*lle 7

首先,对@JonSpring +1,这只是他们回答结束时想法的扩展。如果创建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...
Run Code Online (Sandbox Code Playgroud)

使用该n.overlapsst_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)
Run Code Online (Sandbox Code Playgroud)

为了进一步扩展并使不同的多边形更加清晰,请使用离散的填充比例而不是alpha进行外观:

grid_sf  %>%
  ggplot() +
  geom_sf(aes(fill = as.factor(n.overlaps))) +
  scale_fill_brewer(palette = "YlGnBu")
Run Code Online (Sandbox Code Playgroud)


P1s*_*ius 6

可以使用以下方法添加 Alpha ( https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending )

两个合并形状的 alpha 计算如下:
A(out) = A(src) + A(dst) * 1-A(src)

因此,对于 A(src) = A(dst) = 0.33,我们得到:

x = 0.33  
y = x + x*(1-x)  
y
Run Code Online (Sandbox Code Playgroud)

[1] 0.5511

如果我们有三个形状,A = 0.33,我们得出:

y = x + x*(1-x) + x*(1-(x + x*(1-x)))
y
Run Code Online (Sandbox Code Playgroud)

[1] 0.699237

我可以继续讨论将 2 或 3 个形状添加在一起时哪些值会导致 1,但最有用的评论是 alpha 不是以加法方式组合的。


Jon*_*ing 5

除了@MKBakker的答案外,还可以使用一种函数来根据任意数量的层和alpha值预测所得的alpha:

alpha_out <- function(alpha, num = 1) {
  result = alpha
  if(num == 1)  return(result)
  for(i in 2:num) { result = result + alpha * (1-result) }
  return (result)
}

alpha_out(0.33, 1)
#[1] 0.33
alpha_out(0.33, 2)
#[1] 0.5511
alpha_out(0.33, 3)
#[1] 0.699237
Run Code Online (Sandbox Code Playgroud)

这样可以更轻松地看到alpha渐近地接近1并具有更多的层。

alpha_out(0.33, 40)
#[1] 0.9999999
Run Code Online (Sandbox Code Playgroud)

如果假设0.99“足够接近”,则需要使用0.8来达到三层

alpha_out(0.8, 3)
#[1] 0.992
Run Code Online (Sandbox Code Playgroud)

编辑:添加结果图表

我们可以看到从一系列的Alpha和图层中可以得到什么结果:

library(tidyverse)
alpha_table <- 
  tibble(
    alpha = rep(0.01*1:99, 10),
    layers = rep(1:10, each = 99)
  )

alpha_table <- alpha_table %>%
  rowwise() %>%
  mutate(result = alpha_out(alpha, layers))

ggplot(alpha_table, aes(alpha, result, color = as_factor(layers),
                    group = layers)) +
geom_line()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我们还可以看到,给定每个层数,要通过组合不透明度阈值需要多少阿尔法。例如,对于给定数量的图层,这是要达到0.99总不透明度所需的alpha数量。例如,对于5层,您需要alpha = 0.61

alpha_table %>%
  group_by(layers) %>%
  filter(result >= 0.99) %>%
  slice(1)
## A tibble: 10 x 3
## Groups:   layers [10]
#   alpha layers result
#   <dbl>  <int>  <dbl>
# 1  0.99      1  0.99 
# 2  0.9       2  0.99 
# 3  0.79      3  0.991
# 4  0.69      4  0.991
# 5  0.61      5  0.991
# 6  0.54      6  0.991
# 7  0.49      7  0.991
# 8  0.44      8  0.990
# 9  0.41      9  0.991
#10  0.37     10  0.990
Run Code Online (Sandbox Code Playgroud)

所有这一切都表明,我认为没有一种简单的实现可以得到您想要的东西。如果要在重叠区域中100%变暗,则可以尝试以下方法:

  • 事实之后的图像处理(也许可以使用进行操作imagemagick)以应用亮度曲线,以使暗区100%变黑,并使其他区域缩放到您期望的暗度。

  • 将图形转换为sf对象并分析形状以某种方式计算在任何给定点有多少个形状重叠。然后,您可以将其手动映射到所需的黑暗度。