Как мне изменить значение цвета только одного значения в ggplot2 scale_fill_brewer? - PullRequest
21 голосов
/ 20 мая 2011

У меня есть R-фрейм данных (df), который я строю в виде гистограммы в ggplot2, и раскраска основана на столбце в фрейме данных (df$type).Прямо сейчас я использую шаблон окраски по умолчанию (scale_fill_brewer) для назначения цветов.

Как я могу назначить черный цвет одному значению (df$type == -1) и использовать scale_fill_brewer для назначения остальных цветов?(все остальные df$types находятся в пределах набора целых чисел от 1 до X, где X - количество уникальных значений)

До сих пор я мог сделать это вручную, выяснив наборcolors scale_fill_brewer использует для N различных элементов, затем предваряет черный цвет и передает его в scale_fill_manual.

rhg_cols1<- c("#000000","#F8766D","#7CAE00","#00BFC4","#C77CFF" )
ggplot(y=values,data=df, aes(x=name, fill=factor(type))) + 
  geom_bar()+ scale_fill_manual(values = rhg_cols1)

Проблема в том, что мне нужно решение, которое работает без ручного назначения цветов с использованием шестнадцатеричного цветакалькулятор для определения шестнадцатеричных значений scale_fill_brewer.

что-то вроде:

ggplot(y=values,data=df, aes(x=name, fill=factor(type))) +
  geom_bar()+ scale_fill_brewer(value(-1, "black")

Спасибо!

РЕДАКТИРОВАТЬ: решение должно работать для более чем 30 цветови работа для "Set2" ColorBrewer

Ответы [ 2 ]

36 голосов
/ 20 мая 2011

Пакет RColorBrewer содержит палитры, и вы можете использовать функцию brewer.pal для возврата выбранной вами цветовой палитры.

Например, последовательная синяя палитра из 5 цветов:

library(RColorBrewer)
my.cols <- brewer.pal(5, "Blues")
my.cols

[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C"

Вы можете получить список допустимых имен палитр в ?brewer.pal файлах справки.Эти имена соответствуют именам на веб-сайте ColorBrewer .

Теперь вы можете использовать или изменить результаты и передать их в ggplot, используя scale_manual_fill, как вы предлагали:

my.cols[1] <- "#000000"

library(ggplot2)
df <- data.frame(x=1:5, type=1:5)
ggplot(df, aes(x=x, fill=factor(type))) +
    geom_bar(binwidth=1)+ 
    scale_fill_manual(values = my.cols)

enter image description here

20 голосов
/ 20 мая 2011

Если вам необходимо различать среди множества (более 30) различных категорий, вам, вероятно, необходимо выполнить резервное копирование и потратить больше времени на стратегическое размышление о проекте: почти невозможно придумать набор из 30 цветов. ) rs, которые фактически различимы (особенно способом, который не зависит от платформы / канала рендеринга).

В принципе нет решения, которое будет работать с Set2 и более 30 цветами. Некоторые из палитр CB (Set3 и Paired; library(RColorBrewer); display.brewer.all(n=12)) допускают до 12 цветов.

edit : ОП хочет провести исследовательский анализ данных с хорошими различимыми цветами, которые не сломаются, если будет много категорий. Я хотел бы предложить что-то вроде этого:

library(RColorBrewer)
my.cols <- function(n) {
  black <- "#000000"
  if (n <= 9) {
    c(black,brewer.pal(n-1, "Set2"))
  } else {
    c(black,hcl(h=seq(0,(n-2)/(n-1),
                  length=n-1)*360,c=100,l=65,fixup=TRUE))
  }
}

library(ggplot2)
d <- data.frame(z=1:10)
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none")
g1 + scale_colour_manual(values=my.cols(9))
g1 + scale_colour_manual(values=my.cols(10))
## check that we successfully recreated ggplot2 internals
## g1+scale_colour_discrete()

Я думаю, что это работает достаточно хорошо (вы можете заменить Set3 и отсечение 13 цветов, если хотите). Единственный недостаток (который я могу придумать) - это разрыв между участками с 9 и 10 цветами.

Придумать лучшее решение для выбора наборов из N различимых цветов программным способом будет довольно сложно ...

...