如何计算特定alpha值的叠加元素近似不透明所需数量?
- 不透明度(Opacity)不具备叠加性。
- 透射率(Transmissivity)= 1 - 不透明度。
- 透射率遵循相乘法则。
是否存在公式可确定,使用特定alpha=值的叠加观测元素,需要多少次叠加才能近似达到不透明状态?
本问题关联R语言与ggplot2,但不局限于特定语言或绘图机制,不确定ggplot2的alpha实现是否为行业通用标准。
测试代码(未优化)
library(ggplot2) alphas <- c(seq(0.001, 0.01, by=0.001), seq(0.01, 0.1, by=0.01)[-1]) ns <- seq(0, 100, 10) expand.grid(alpha1 = alphas, n1 = ns) |> reframe( .by = everything(), x = factor(as.character(rep(alpha1, n1)), levels = as.character(alphas)), y = factor(as.character(rep(n1, n1)), levels = as.character(ns)) ) |> ggplot(aes(as.numeric(x), as.numeric(y))) + geom_point(aes(alpha=alpha1), size=3, color='red') + geom_point(aes(x=as.numeric(x)+0.1,y=as.numeric(y)+0.1), size=3, alpha=1, color='red')+ scale_x_continuous( name = "alpha", breaks=as.numeric(factor(as.character(alphas), levels = as.character(alphas))), labels=alphas ) + scale_y_continuous( name = "Number of points", breaks=as.numeric(factor(as.character(ns), levels = as.character(ns))), labels=ns ) + scale_alpha_identity(guide = "none")

作为非色彩专业人士,原本以为10%的alpha值需要10次叠加才能接近不透明,但实际测试中,alpha=0.01时仅10次叠加在显示器上看起来就接近不透明,远低于预期的100次。
由于这涉及色彩视觉敏感性,存在主观性,但对于熟悉色彩控制的专业人士,是否存在数学公式或经验性的预期来确定叠加次数?
编辑说明:将
scale_alpha_continuous()修改为scale_alpha_identity(),并相应调整了ns参数。
数学推导与经验结论
根据透射率相乘的核心规则,假设每次叠加元素的不透明度为α(即alpha值),单次透射率为T = 1 - α,经过n次叠加后总透射率为T^n = (1 - α)^n。
数学公式推导
我们需要总透射率降低到人眼无法区分的近似不透明状态,通常以**总透射率≤1%**为标准(此时仅1%背景光线穿透),推导过程如下:
- 设
(1 - α)^n ≤ 0.01 - 两边取自然对数(因
ln(x)在x<1时为负,不等式方向反转):n ≥ ln(0.01) / ln(1 - α) - 简化得:
n ≥ -4.605 / ln(1 - α)
当α较小时(如α≤0.1),可近似ln(1 - α) ≈ -α,公式简化为:n ≈ 4.605 / α
视觉感知的经验调整
实际观察中阈值会更低,因为人眼对亮度差异的感知并非线性,且显示器色彩输出会影响判断。经验上,当叠加后的**有效不透明度(1 - (1-α)^n)≥90%**时,多数场景下视觉上已接近不透明,推导得:n ≥ ln(0.1)/ln(1-α) ≈ 2.303/α
需要注意的是,ggplot2的alpha实现遵循行业通用的预乘alpha规则,上述公式完全适用。
内容的提问来源于stack exchange,提问作者r2evans

