我不确定在ggplot2 中是否有一种自然的方法可以做到这一点,但这里有一个 hacky 方法:颜色审美决定了线条、胡须和异常点的颜色。因此,我们将为情节添加色彩美学。但是,我们将手动设置颜色,以便它们在颜色定义中包含 alpha 值序列。因此,我们有效地将 alpha 值添加到颜色美学中。我已将美学映射到 Species,以便我可以使用三个不同的 alpha 级别进行说明,并添加了 theme_bw() 以更好地对比 alpha 值。
首先,在最终图表中设置我们想要的 alpha 值:
numVals = length(unique(iris$Species))
avals = seq(0.9, 0.3, length.out=numVals)
技巧如下:将所有颜色设置为黑色,但将 alpha 级序列添加到颜色定义中。为此,我们需要将 alpha 级别转换为 0 - 255 范围内的十六进制。
avalsHex = paste0("#000000", toupper(as.hexmode(round(avals*255))))
在上面的代码中,avals*255 是 0 - 255 范围内的 alpha 级别。 as.hexmode 将这些值转换为十六进制。 toupper 不是绝对必要的,但我习惯于看到大写的十六进制颜色定义。然后我们将两位十六进制 alpha 值粘贴到颜色的末尾,在本例中为黑色 (#000000),它给出了一个包含 alpha 值的三种颜色的向量。
不,我们使用颜色和 alpha 美学以及每种美学的手动值进行绘制:
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot(aes(color=Species, alpha = Species)) +
scale_alpha_manual(values = avals) +
scale_colour_manual(values = avalsHex)
更新:为了解决您的评论,这里有一个示例,除了 alpha 值之外还有不同的颜色:
avalsHex = paste0(c("#FF0000","#00FF00","#0000FF"), toupper(as.hexmode(round(avals*255))))
然后只需运行相同的绘图代码即可获得:
更新 2: 考虑颜色让我意识到您甚至不需要转换为十六进制来添加 alpha 值。例如,使用hcl 颜色,您可以这样做:
# Black boxplots with 3 different alpha levels
scale_colour_manual(values = hcl(0,0,0, alpha=avals))
# Colored boxplots with 3 different alpha levels
scale_colour_manual(values=hcl(seq(15,375,length.out=4)[1:3], 100, 65, alpha=avals))
hcl 函数返回每种颜色的十六进制代码,实际上是为您处理转换。