我有一个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 -ing(通过变量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变量增加了对颜色子集的控制级别。

最佳答案

我不确定您为什么要这么做,因此很难知道我是否提出了解决您的实际用例的方法。

首先,我生成了一个不同的数据集,该数据集实际上在每个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中选择了一个默认调色板来显示该想法。这给出了:

r - 在构面之间更改配色方案-LMLPHP

它还提供了一个相对可用的图例作为起点,尽管您可以进一步对其进行修改(这是我为另一个问题提供的类似图例答案: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)

给出:

r - 在构面之间更改配色方案-LMLPHP

图例比较忙,但是可以像我链接到的其他答案一样进行修改。然后,这将允许您设置所需的9种(或更多,针对不同的用例)颜色。

关于r - 在构面之间更改配色方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41492733/

10-09 18:19