2017-01-05 4 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 -ную (по переменной 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) будут указаны вручную самим.

Edit: Для разъяснения, фасета, что я хотел бы, чтобы в конечном итоге действительно обеспечивается следующим кодом:

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, а затем заполнить их (используя «вставку» или «взаимодействие» для создания нового столбца). У меня нет времени написать хороший ответ, но я попытаюсь найти время позже, если никто другой не сделает это первым. – 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") 

Здесь я установил диапазон альфа дать достаточно видимые цвета, и просто выбрать палитру по умолчанию от 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

Смежные вопросы