studio - superponer graficas en r ggplot
Cómo pedir los colores de relleno dentro de ggplot2 geom_bar (4)
Estoy llamando a la función ggplot
ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity")
El resultado es una barra de barras con barras rellenas por varios colores correspondientes a la categoría. Sin embargo, el orden de los colores no es consistente de barra a barra. Diga que hay rosa, verde y azul. Algunas barras se ponen rosa, verde, azul de abajo hacia arriba y otras se vuelven verdes, rosadas, azules. No veo ningún patrón obvio.
¿Cómo se eligen estos pedidos? ¿Cómo puedo cambiarlo? Por lo menos, ¿cómo puedo hacer que ggplot elija un pedido consistente?
La clase de (x, y y categoría) son (entero, numérico y factor) respectivamente. Si hago de categoría un factor ordenado, no cambia este comportamiento.
¿Alguien sabe cómo arreglar esto?
Ejemplo reproducible:
dput(data)
structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L,
10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L,
7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L,
9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L,
6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L,
8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L,
8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down",
"Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up"
), class = c("ordered", "factor")), NG = c(222614.67, 9998.17,
351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52,
15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21,
120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06,
4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26,
384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96,
3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG"
), row.names = c(NA, -40L), class = "data.frame")
ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity")
Comenzando en ggplot2_2.0.0, la order
estética ya no está disponible. Para obtener un gráfico con las pilas ordenadas por color de relleno, simplemente puede ordenar el conjunto de datos por la variable de agrupación que desea ordenar.
A menudo utilizo arrange
de dplyr para esto. Aquí estoy ordenando el conjunto de datos por el factor de fill
dentro de la llamada ggplot
lugar de crear un conjunto de datos ordenado, pero cualquiera de ellos funcionará bien.
library(dplyr)
ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) +
geom_bar(stat = "identity")
Esto se hace fácilmente en la base R, por supuesto, usando el order
clásico con los corchetes del extracto:
ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) +
geom_bar(stat = "identity")
Con la trama resultante en ambos casos ahora en el orden deseado:
Actualización de ggplot2_2.2.0
En ggplot_2.2.0, el orden de relleno se basa en el orden de los niveles de los factores. La orden predeterminada trazará el primer nivel en la parte superior de la pila en lugar de la parte inferior.
Si quiere el primer nivel en la parte inferior de la pila, puede usar reverse = TRUE
en position_stack
. Tenga en cuenta que también puede usar geom_col
como acceso directo para geom_bar(stat = "identity")
.
ggplot(data, aes(mon, NG, fill = gclass)) +
geom_col(position = position_stack(reverse = TRUE))
Para ordenar, debe usar el parámetro de levels
e informar la orden. Me gusta esto:
data$gclass
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity")
Puede cambiar el color usando las funciones scale_fill_
. Por ejemplo:
ggplot(dd,aes(mon,NG,fill=gclass)) +
geom_bar(stat="identity") +
scale_fill_brewer(palette="blues")
Para obtener pedidos consistentes en las bars
, necesita ordenar el marco de datos:
dd = dd[with(dd, order(gclass, -NG)), ]
Para cambiar el orden de la leyenda, modifique el factor de gclass
. Entonces algo así como:
dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE))
También debe especificar el order
estético.
ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
geom_bar(stat="identity")
Esto puede o no ser un bug .