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