【问题标题】:Changing colour schemes between facets更改构面之间的配色方案
【发布时间】:2017-01-06 21:30:12
【问题描述】:

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

【问题讨论】:

  • 这在很大程度上是一个非常好的和可重复的问题(干得好!),但我需要澄清一下。 (a) 我很惊讶你的示例情节包含你想要的方面......只是添加+ facet_wrap(~age_group)你的想法?也许将其包含在您的示例中。 (b) 你对传奇有什么想法?一个具有所有年龄组/班级互动的传奇人物?还是每个子图都有一个单独的图例?
  • 我在上面的问题中添加了我想要的最后一个方面。你的假设是正确的,我只想包括facet(~age_group)。你关于传说的观点很有趣,我没有想到这一点。某种传说,我可以在对应于“高”,“中”和“低”级别的块中使用三种颜色会很好,但我想这超出了ggplot的控制范围。欢迎提出建议。
  • 我有 this old question 关于在 grid 系统中制作“网格”图例 - 你可能会适应它。至于颜色,我只需在您的数据中添加一列,它是 class 和 age_group 的组合,然后填充(使用 pasteinteraction 创建新列)。我现在没有时间写一个好的答案,但是如果没有其他人先写,我会稍后再找时间。
  • 您的示例是否可能不太理想?对于每个 age_group,只有一个 class 值(例如,age_group 1 只有 class“high”)。这意味着您将在每个方面获得不同的颜色,而无需做任何特别的事情。如果这不是您的想法,那么创建一个更真实的可重现示例将很有用。 (为了弥补所有的唠叨:正如 Gregor 已经提到的,您确实创建了一个可重复的工作示例,这是一件非常好的事情!)
  • 我相信 Mark Peterson 在他的回答中生成的数据更能代表我正在使用的数据,如前所述,您可以在各个年龄段获得许多课程。感谢您的友好评论。

标签: r ggplot2


【解决方案1】:

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

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

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

给予:

传说相当繁忙,但可以像我链接到的其他答案一样进行修改。然后,这将允许您设置所需的任何 9 种(或更多,用于不同的用例)颜色。

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 2017-10-30
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2011-04-27
    • 2021-05-08
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多