tutorial - varias graficas en r ggplot




¿Cómo asignar colores a las variables categóricas en ggplot2 que tienen un mapeo estable? (4)

En base a la respuesta muy útil de joran, pude encontrar esta solución para una escala de color estable para un factor booleano ( TRUE , FALSE ).

boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294"))
boolScale <- scale_colour_manual(name="myboolean", values=boolColors)

ggplot(myDataFrame, aes(date, duration)) + 
  geom_point(aes(colour = myboolean)) +
  boolScale

Como ColorBrewer no es muy útil con escalas de color binarias, los dos colores necesarios se definen manualmente.

Aquí myboolean es el nombre de la columna en myDataFrame contiene el factor VERDADERO / FALSO. date y duration son los nombres de las columnas que se asignarán a los ejes x e y de la gráfica en este ejemplo.

Me he estado poniendo al día con R en el último mes.

Aquí está mi pregunta:

¿Cuál es una buena manera de asignar colores a las variables categóricas en ggplot2 que tienen un mapeo estable? Necesito colores uniformes en un conjunto de gráficos que tienen diferentes subconjuntos y un número diferente de variables categóricas.

Por ejemplo,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()

donde categoricalData tiene 5 niveles.

Y entonces

plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, 
                                 color=categoricaldData.subset)) + geom_line()

donde categoricalData.subset tiene 3 niveles.

Sin embargo, un nivel particular que está en ambos conjuntos terminará con un color diferente, lo que hace que sea más difícil leer los gráficos juntos.

¿Necesito crear un vector de colores en el marco de datos? ¿O hay otra forma de asignar colores específicos a las categorías?


Esta es una publicación anterior, pero estaba buscando una respuesta a esta misma pregunta,

Por qué no probar algo como:

scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))

Si tiene valores categóricos, no veo una razón por la cual esto no debería funcionar.


La solución más fácil es convertir su variable categórica en un factor antes de la subconjunto. En resumen, necesita una variable de factor con exactamente los mismos niveles en todos sus subconjuntos.

library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100), 
    x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

Con una variable de caracteres

ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()

Con una variable de factor

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

Para situaciones simples como el ejemplo exacto en el OP, estoy de acuerdo en que la respuesta de Thierry es la mejor. Sin embargo, creo que es útil señalar otro enfoque que se vuelve más fácil cuando intenta mantener esquemas de color consistentes en múltiples marcos de datos que no se obtienen subconjuntos de un único marco de datos grande. Administrar los niveles de factores en múltiples marcos de datos puede volverse tedioso si se extraen de archivos separados y no todos los niveles de factores aparecen en cada archivo.

Una forma de abordar esto es crear una escala de color manual personalizada de la siguiente manera:

#Some test data
dat <- data.frame(x=runif(10),y=runif(10),
        grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)

#Create a custom color scale
library(RColorBrewer)
myColors <- brewer.pal(5,"Set1")
names(myColors) <- levels(dat$grp)
colScale <- scale_colour_manual(name = "grp",values = myColors)

y luego agregue la escala de colores en la gráfica según sea necesario:

#One plot with all the data
p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
p1 <- p + colScale

#A second plot with only four of the levels
p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale

La primera trama se ve así:

y el segundo argumento se ve así:

De esta forma, no necesita recordar o verificar cada marco de datos para ver si tienen los niveles adecuados.