2017-01-05 182 views
0

我有一个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其中填充拿到三方面-ED地块,分裂在每个图中给出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可变颜色子集的控制的附加级。

+0

这在很大程度上是一个非常好的和可重复的问题(很好的工作!),但我需要一些澄清。 (a)我很惊讶你的例子情节*不包括你想要的方面......只是添加'+ facet_wrap(〜age_group)'你想到的是什么?也许在你的例子中包括这一点。 (b)你对传奇有什么想法?一个具有所有年龄段/班级互动的传奇?或每个子区块的个别图例? – Gregor

+0

我已经在上面的问题中添加了我想要的最后一个方面。根据你的假设,你是正确的,我只是想包括'facet(〜age_group)'。 你对这个传说的观点很有趣,我没有想到这一点。某种传说中,我可以有三种颜色的区块对应“高”,“中”和“低”等级,但是我认为这超出了ggplot的控制范围。我很欢迎你的建议。 – Ross

+0

我有[这个老问题](http://stackoverflow.com/q/20129299/903061)关于在“网格”系统中制作“网格”传说 - 你可能会适应它。至于颜色,我只是将数据添加到类和age_group的组合中,然后填充(使用'paste'或'interaction'来创建新列)。我现在没有时间写出一个很好的答案,但如果没有其他人先做,我会尽力在以后找到时间。 – Gregor

回答

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显示的想法。这给:

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) 
          , ")")) 

然后,用它作为个够。请注意,我使用RColorBrewerbrewer.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(或更多,用于不同的用例)你想要的颜色。

+0

嗨@Mark,谢谢你的回应,这正如我所愿。我的理由是,我们有一个内部的风格,理想的情况下,我们将自定义颜色放在不同的调色板中,最多可达八个维度。 通常情况下,我们有一个视觉团队来处理这些问题,但他们通常很繁忙,我鼓励分析师使用ggplot探索他们自己的视觉选项。 – Ross