En R, ¿cómo cambio el valor del color de solo un valor en scale_fill_brewer de ggplot2?

Tengo un dataframe R (df) que estoy trazando como un gráfico de barras en ggplot2, y coloreado en base a una columna en el dataframe ( df$type ). En este momento, estoy usando el patrón de coloreado predeterminado (scale_fill_brewer) para asignar colores.

¿Cómo puedo asignar el color negro a un valor ( df$type == -1 ) y usar scale_fill_brewer para asignar el rest de los colores? (todos los demás tipos de df $ están dentro de un conjunto de números enteros de 1 a X, donde X es el número de valores únicos)

Hasta ahora, he podido hacer esto de forma manual calculando el conjunto de colores scale_fill_brewer utiliza para N diferentes elementos, luego los detiende el color negro y los pasa a 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) 

El problema es que necesito una solución que funcione sin asignar colores manualmente usando una calculadora de color hexadecimal para calcular los valores hexadecimales de scale_fill_brewer.

algo como:

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

¡Gracias!

EDITAR: la solución debe funcionar para más de 30 colores y funcionar para “Set2” de ColorBrewer

El paquete RColorBrewer contiene las paletas y puede usar la función brewer.pal para devolver una paleta de colores de su elección.

Por ejemplo, una paleta azul secuencial de 5 colores:

 library(RColorBrewer) my.cols <- brewer.pal(5, "Blues") my.cols [1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C" 

Puede obtener una lista de nombres de paletas válidos en los archivos de ayuda de ?brewer.pal . Estos nombres se corresponden con los nombres en el sitio web de ColorBrewer .

Ahora puede usar o modificar los resultados y pasarlos a ggplot usando scale_manual_fill como sugirió:

 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

Si necesita distinguir entre estas muchas (30+) categorías diferentes, probablemente necesite realizar una copia de seguridad y dedicar más tiempo a pensar estratégicamente en el proyecto: será casi imposible obtener un conjunto de 30 colores (u) que son realmente distinguibles (especialmente de una manera que es independiente de la plataforma / canal de representación).

Básicamente, no hay una solución que funcione con Set2 y más de 30 colores. Algunas de las paletas CB ( Set3 y Set3 ; library(RColorBrewer); display.brewer.all(n=12) ) permiten hasta 12 colores.

editar : el OP desea realizar análisis de datos exploratorios con colores buenos y distinguibles que no se rompan si hay muchas categorías. Sugeriría algo de esta manera:

 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() 

Creo que esto funciona razonablemente bien (podrías sustituir Set3 y un corte de 13 colores si lo prefieres). El único inconveniente (que se me ocurre) es la discontinuidad entre las ttwigs con 9 y 10 colores.

Proponer una mejor solución para elegir conjuntos de N colores distinguibles de forma programática será bastante difícil ...