geom_boxplot:将alpha级别映射到胡须和异常值

mdl*_*oln 5 r ggplot2

是否有一种方法可以使geom_boxplot线条,胡须和异常点继承与alpha下图fill中分配给箱线图的相同?

library(ggplot2)

ggplot(iris, aes(x = Species, y = Sepal.Length, alpha = Species == "setosa")) +
  geom_boxplot() +
  scale_alpha_discrete(range = c(0.5, 1))
Run Code Online (Sandbox Code Playgroud)

eip*_*i10 5

我不确定在 内是否有一种自然的方法来做到这一点ggplot2,但这里有一个hacky 方法:颜色美学决定了线条、胡须和异常点的颜色。因此,我们将为情节添加颜色美感。但是,我们将手动设置颜色,以便它们在颜色定义中包含 alpha 值序列。因此,我们有效地将 alpha 值添加到颜色美学中。我已经将美学映射到,Species以便我可以使用三个不同的 alpha 级别进行说明,并添加theme_bw()了更好的 alpha 值对比度。

首先,在最终图中设置我们想要的 alpha 值:

numVals = length(unique(iris$Species))
avals = seq(0.9, 0.3, length.out=numVals)
Run Code Online (Sandbox Code Playgroud)

技巧如下:将所有颜色设置为黑色,但将 alpha 级序列添加到颜色定义中。为此,我们需要将 alpha 级别转换为 0 - 255 范围内的十六进制。

avalsHex = paste0("#000000", toupper(as.hexmode(round(avals*255))))
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新:为了解决您的评论,这里有一个示例,除了 alpha 值之外还有不同的颜色:

avalsHex = paste0(c("#FF0000","#00FF00","#0000FF"), toupper(as.hexmode(round(avals*255))))
Run Code Online (Sandbox Code Playgroud)

然后只需运行相同的绘图代码即可获得:

在此处输入图片说明

更新 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)) 
Run Code Online (Sandbox Code Playgroud)

hcl函数返回每种颜色的十六进制代码,实际上为您处理转换。