В R, как мне изменить значение цвета только одного значения в scale_fill_brewer ggplot2?

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

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

До сих пор я был в состоянии сделать это вручную, выяснив набор цветов, которые 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 ответа

Решение

Посылка 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)

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

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

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

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 различимых цветов программным способом будет довольно сложно...

Другие вопросы по тегам