更改构面之间的颜色方案

时间:2017-01-05 19:03:46

标签: r ggplot2

我有data.frame,如下所示:

set.seed(100)

df <- data.frame(year = rep(2011:2014, 3), 
                 class = rep(c("high", "middle", "low"), each = 4), 
                 age_group = rep(1:3, each = 4), 
                 value = sample(1:2, 12, rep = TRUE))

我希望通过facet - (通过变量age_group)生成三个图,这些图看起来类似于以下代码生成的图:

library(ggplot2)
blue <- c("#bdc9e1", "#74a9cf", "#0570b0")
ggplot(df) + geom_bar(aes(x = year, y = value, 
                          fill = factor(class, levels = c("high", "middle", "low"))), 
                      stat = "identity") + 
  scale_fill_manual(values = c(blue)) +
  guides(fill = FALSE)

但是,每个方面都有不同的配色方案,其中所有颜色都由我自己指定。

我似乎想要了解更多特定版本的内容:ggplot2: Change color for each facet in bar chart

因此,使用我提供的数据,我希望获得三个分面图,按age_group分割,其中每个图中的填充量为class,并且颜色(总共9个)将由我自己手动指定。

编辑:为了澄清,我希望最终得到的方面确实由以下代码提供:

ggplot(df) + geom_bar(aes(x = year, y = value, 
                          fill = factor(class, levels = c("high", "middle", "low"))), 
                      stat = "identity") + 
  scale_fill_manual(values = c(blue)) +
  guides(fill = FALSE) + 
  facet_wrap(~ age_group)

通过class变量增加对颜色子集的控制级别。

1 个答案:

答案 0 :(得分:5)

我不完全确定为什么你想要这样做,所以有点难以知道我提出的是否解决了你的实际用例。

首先,我生成了一个不同的数据集,实际上每个age_group中都有一个类:

set.seed(100)

df <- data.frame(year = rep(2011:2014, 3), 
                 class = rep(c("high", "middle", "low"), each = 12), 
                 age_group = rep(1:3, each = 4), 
                 value = sample(1:2, 36, rep = TRUE))

如果您要在每个age_group中寻找类似的暗光渐变,则可以使用alpha直接完成此操作,而无需担心添加额外的数据列:

ggplot(df) +
  geom_bar(aes(x = year, y = value, 
               fill = factor(age_group)
               , alpha = class ), 
           stat = "identity") + 
  facet_wrap(~age_group) +
  scale_alpha_discrete(range = c(0.4,1)) +
  scale_fill_brewer(palette = "Set1"
                    , name = "age_group")

在这里,我设置alpha的范围以提供合理可见的颜色,并且只选择RColorBrewer中的默认调色板来显示该想法。这给出了:

enter image description here

它还提供了一个相对可用的图例作为起点,但您可以进一步修改它(这是我给另一个问题的类似图例答案:https://stackoverflow.com/a/39046977/2966222

或者,如果您确实想要自己指定颜色,可以在数据中添加一个列,并将颜色基于该颜色:

df$forColor <-
  factor(paste0(df$class, " (", df$age_group , ")")
         , levels = paste0(rep(c("high", "middle", "low"), times = 3)
                           , " ("
                           , rep(1:3, each = 3)
                           , ")") )

然后,将其用作填充物。请注意,我使用RColorBrewer brewer.pal来挑选颜色。我发现第一种颜色太亮而不能显示这样的条形,所以我将其排除在外。

ggplot(df) +
  geom_bar(aes(x = year, y = value, 
               fill = forColor), 
           stat = "identity") + 
  scale_fill_manual(values = c(brewer.pal(4, "Blues")[-1]
                               , brewer.pal(4, "Reds")[-1]
                               , brewer.pal(4, "Purples")[-1]
                               )
                    , name = "Class (age_group)") +
  facet_wrap(~age_group)

给出:

enter image description here

图例相当繁忙,但可以修改,与我链接的其他答案类似。然后,这将允许您设置所需的9种(或更多,用于不同用例)颜色。