我努力理解(并控制)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()
添加到@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()
而且我们还可以看到,给定每个层数,我们需要通过多少个不透明度组合阈值。例如,对于给定数量的图层,这是要达到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
对象并分析形状以某种方式计算在任何给定点有多少个形状重叠。然后,您可以将其手动映射到所需的黑暗度。
首先,对@JonSpring +1,这只是他们回答结尾的想法的扩展。如果创建sf
对象,则可以轻松获得多边形的交点。您最终绘制的不是圆本身,而是将相交的零件分开而产生的多边形。
可以使用以下方法添加Alpha(https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending)