Configuración manual de colores de grupo para ggplot2
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 C
es el mismo color en Plot 1
y 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.
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"))
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"))
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