ggplot2 箱线图中的 alpha 和填充图例?

alpha and fill legends in ggplot2 boxplots?

我正在尝试结合 alphafill 美学。它在我使用 geom_bar(或 geom_points,对于 color)时有效,但当我使用 geom_boxplot.[= 时,alpha 图例不起作用25=]

library(data.table)
library(ggplot2)
dt = data.table(x = rep(1:5,6), y = rnorm(30),
               tag1 = rep(c('hey', 'what'), 15),
               tag2 = rep(c('yeah', 'yeah', 'so', 'so', 'so'), 6))

它适用于酒吧:

ggplot(dt[, list(y = mean(y)), by = list(x, tag1, tag2)],
       aes(x = x, y = y, fill = tag1, alpha = tag2,
           group = interaction(x,tag1,tag2))) +
  geom_bar(stat = 'identity', position = 'dodge')

但不适用于箱线图 - alpha 图例为空。

ggplot(dt, aes(x = x, y = y, fill = tag1, alpha = tag2,
               group = interaction(x, tag1, tag2))) +
  geom_boxplot()

可以在没有填充的情况下完成更简单的版本 - 条形图默认为 gray/lightgray,箱线图默认为 white/lightwhite:

ggplot(dt[, list(y = mean(y)), by = list(x, tag2)],
       aes(x = x, y = y, alpha = tag2,
           group = interaction(x,tag2))) +
 geom_bar(stat = 'identity')

ggplot(dt, aes(x = x, y = y, alpha = tag2,
               group = interaction(x, tag2))) +
  geom_boxplot()

但我不太确定如何解决这个问题。有什么想法吗?

我不确定为什么 ggplot 实际上没有在箱线图的图例中提供 alpha 水平,但您可以使用 override.aes 对其进行硬编码。 (编者按:我发现箱线图或条形图的 alpha 美学有点令人困惑。很难在心理上将透明度与填充颜色区分开来,灰度 alpha 图例加剧了这个问题,因为没有任何东西被映射到灰色情节。)

在下面的代码中,为了提高图例的可见性,我从 alpha 图例中删除了框线并增加了图例键的高度。我还编辑了美学以消除对 group 参数的需要。

ggplot(dt, aes(x=factor(x), y=y, fill=tag1, alpha=tag2)) + 
  geom_boxplot() +
  scale_alpha_manual(values=c(0.2,0.7)) +
  guides(alpha=guide_legend(override.aes=list(fill=hcl(c(15,195),100,0,alpha=c(0.2,0.7)),
                                              colour=NA))) +
  theme(legend.key.height=unit(1,"cm"))

另一种选择是对填充和 alpha 美学使用 interaction,但事实证明 ggplot 在这种情况下不包含任何颜色:

ggplot(dt, aes(x=factor(x), y=y, alpha=interaction(tag1,tag2)), 
       fill=interaction(tag1,tag2)) + 
  geom_boxplot() +
  scale_fill_manual(values=rep(hcl(c(15,195),100,65), 2)) +
  scale_alpha_manual(values=rep(c(0.3, 1), each=2)) +
  theme(legend.key.height=unit(2,"cm")) 

因此,您可以使用填充美学来完成这一切,但在颜色规范中包括透明度。这行得通,但是,再一次,因为透明度和颜色在视觉感知中有些混杂,最好只使用四种不同的颜色。

ggplot(dt, aes(x=factor(x), y=y, fill=interaction(tag1,tag2,sep="-"))) + 
  geom_boxplot() +
  scale_fill_manual(values=hcl(c(15,195,15,195),100,65, alpha=c(0.4,0.4,1,1))) +
  theme(legend.key.height=unit(1,"cm")) +
  labs(fill="Tag 1 - Tag 2")