Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Пакет 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

Ответ 2

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

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

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

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