ggplot:分组条形图 - 每组的 alpha 值和图例

ggplot: grouped bar plot - alpha value & legend per group

我有两个数据点的数据用于观察(由 res 中唯一的 pty/time 组合表示),我想将其绘制为条形图。

考虑这个玩具数据:

df <- data.frame(pty = c("A","A","B","B","C","C"),
       print_col = c("#FFFF00", "#FFFF00", "#000000", "#000000", "#ED1B34", "#ED1B34"),
       time = c(2020,2016,2020,2016,2020,2016),
       res = c(20,35,30,35,40,45))

我正在使用 ggplot(df) + geom_bar(aes(pty, res , fill = as.factor(pty), group=as.factor(time)), position = "dodge", stat = "summary" , fun = "mean") 绘制此图,结果如下(见下文)。

但是,我想改变两件事:

  1. 着色:(i) 条形颜色应从相应行的 print_col 列中获取,并且 (ii) 对于 time==2016,我想要一个 alpha.5 为了更好的可读性。
  2. 图例:fill图例是不必要的。相反,我想要 group 的图例(即“时间”作为标题,“2020”/“2016”作为条目)。

我想不出实现这些的方法 - 有人能给我指出正确的方向吗?

添加 alpha 就像将列映射到 alpha 美学一样简单,默认情况下会为您提供图例。使用 fill = I(print_col) 自动设置 'identity' 填充比例,默认隐藏图例。

library(ggplot2)

df <- data.frame(pty = c("A","A","B","B","C","C"),
                 print_col = c("#FFFF00", "#FFFF00", "#000000", "#000000", "#ED1B34", "#ED1B34"),
                 time = c(2020,2016,2020,2016,2020,2016),
                 res = c(20,35,30,35,40,45))


ggplot(df) +
  geom_bar(aes(pty, res, fill = I(print_col), group = time,
               alpha = as.factor(time)),
           position = "dodge", stat = "summary", fun = "mean") +
  # You can tweak the alpha values with a scale
  scale_alpha_manual(values = c(0.3, 0.7))

reprex package (v2.0.1)

创建于 2022-03-09

另一种方法是将 alpha 添加到数据集并在 alpha 参数中调用它。在 scale_alpha() 中,我隐藏了图例,这样您就不必看到两个图例,只保留原始示例中的一个。我还将 scale_fill_manual().

中的颜色称为唯一值
library(ggplot2)
library(dplyr)
df <- data.frame(pty = c("A","A","B","B","C","C"),
                 print_col = c("#FFFF00", "#FFFF00", "#000000", "#000000", "#ED1B34", "#ED1B34"),
                 time = c(2020,2016,2020,2016,2020,2016),
                 res = c(20,35,30,35,40,45))

df <- mutate(df, alph = ifelse(time ==2016 , .5,1))

 ggplot(df) + 
  geom_bar(aes(pty, res , fill = as.factor(pty), group=as.factor(time), alpha = alph),
                      position = "dodge", stat = "summary" , fun = "mean")+
              scale_fill_manual("pty", values  = unique(df$print_col))+
              scale_alpha(guide = "none")