Configuración manual de colores de grupo para ggplot2

Resuelto Ricardo Saporta asked hace 54 años • 1 respuestas

Tengo un conjunto de datos a partir del cual tengo que hacer varias docenas de gráficos. Los datos constan de 30 grupos y varias mediciones dentro de cada grupo.

La mayoría de los gráficos no utilizarán todos los grupos a la vez.

Mi objetivo es tener una única paleta de colores para el conjunto de grupos, de modo que cualquier grupo determinado tenga el mismo color en todos los gráficos. En el siguiente ejemplo, esto significaría que Group Ces el mismo color en Plot 1y en Plot 2.

Mi pregunta es cómo hacer esto.

Probé varias variaciones de scale_fill_manual (y scal_color_manual, cuando corresponde). Si bien los colores se eligen de la paleta designada, parece que no puedo indexar la paleta por grupo, o alguna otra forma de "saltar" los colores correspondientes a un grupo faltante.

También pensé en intentar agregar la información del color como una columna de los datos que se están trazando, pero no estoy seguro de cómo usar esta columna como color para el grupo.

Ejemplo de trama

library(ggplot2)
library(data.table)

# SAMPLE DATA: 
DT1 <- data.table(Name=c("C_sub1", "A_sub1", "A_sub2"), Value=c(2,5,3), Group=c("C", "A", "A"), key="Group")
DT2 <- data.table(Name=c("A_sub1", "B_sub1", "C_sub1", "C_sub2"), Value=c(4,3,6,3), Group=c("A", "B", "C", "C"), key="Group")

# SAMPLE Color Pallette  
ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")

# Add a column for Color, according to the Group
DT1[ColorsDT, Color := i.Color]
DT2[ColorsDT, Color := i.Color]

# A Basic Plot
simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
   geom_bar(stat="identity") + xlab("") + ggtitle(tit)
    # Tried sevearl variations of: 
    #  + scale_fill_manual(values=ColorsDT$Color)


# Plot Them
grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"),  simplePlot(DT2, tit="Plot 2"))
Ricardo Saporta avatar Jan 01 '70 08:01 Ricardo Saporta
Aceptado

Puedes asociar cada uno de tus grupos con un color, luego pasar a la función:

group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", E = "#E3DB71")

simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
  geom_bar(stat="identity") + xlab("") + ggtitle(tit) +
  #Specify colours
  scale_fill_manual(values=group.colors)

Luego usando tus parcelas:

grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"), 
  simplePlot(DT2, tit="Plot 2"))

ingrese la descripción de la imagen aquí

Creo que el problema con tu enfoque fue que los colores no tenían nombre, por lo que scale_fill_manual()no puedo asociarlos. Comparar:

ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")
ColorsDT
#   Group   Color
#1:     A #333BFF
#2:     B #CC6600
#3:     C #9633FF
#4:     D #E2FF33
#5:     E #E3DB71

con:

ColorsDT.name <-  data.table(A = "#333BFF", B = "#CC6600", C = "#9633FF", D = "#E2FF33", E =  "#E3DB71")
ColorsDT.name
#          A       B       C       D       E
# 1: #333BFF #CC6600 #9633FF #E2FF33 #E3DB71
alexwhan avatar Jun 18 '2013 23:06 alexwhan