控制n个重叠区域的alpha混合/不透明度

问题描述 投票:8回答:3

我努力理解(并控制)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() 

enter image description here

r ggplot2 alpha
3个回答
6
投票

添加到@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

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

alpha_out(0.33, 40)
#[1] 0.9999999

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

alpha_out(0.8, 3)
#[1] 0.992

编辑:添加了结果图表

我们可以看到我们将从一系列的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()

enter image description here

而且我们还可以看到,给定每个层数,我们需要通过多少个不透明度组合阈值。例如,对于给定数量的图层,这是要达到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

所有这些都是为了说,我认为没有一种简单的实现可以得到您想要的东西。如果您希望重叠区域100%深色,则可以尝试以下方法:

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

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


8
投票

首先,对@JonSpring +1,这只是他们回答结尾的想法的扩展。如果创建sf对象,则可以轻松获得多边形的交点。您最终绘制的不是圆本身,而是将相交的零件分开而产生的多边形。


4
投票
© www.soinside.com 2019 - 2024. All rights reserved.