【问题标题】:alpha and fill legends in ggplot2 boxplots?ggplot2箱线图中的alpha和填充图例?
【发布时间】:2016-11-15 14:57:11
【问题描述】:

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

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()

一个更简单的版本可以不用填充 - 似乎条形默认为灰色/浅灰色,而箱线图默认为白色/浅白色:

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()

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

【问题讨论】:

    标签: r ggplot2 scale legend alpha


    【解决方案1】:

    我不确定为什么 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"))
    

    另一种选择是将interaction 用于填充和 alpha 美学,但事实证明 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")
    

    【讨论】:

    • 谢谢!奇怪的是 bar 和 boxplot 之间的行为不同,并且必须手动修复它,但这绝对有效!我同意在这个例子中阿尔法是令人困惑的。在我的最终结果中,我使用 alpha 来区分理论结果(透明)和由于采样错误等导致的更混乱的结果。所以我认为它更具可读性。跨度>
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多