Cómo pedir los colores de relleno dentro de ggplot2 geom_bar

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

También debe especificar el order estético.

 ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+ geom_bar(stat="identity") 

enter image description here

Esto puede o no ser un error .

Comenzando en ggplot2_2.0.0, la order estética ya no está disponible. Para obtener un gráfico con las stacks 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 ttwig resultante en ambos casos ahora en el orden deseado: enter image description here

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 stack en lugar de la parte inferior.

Si quiere el primer nivel en la parte inferior de la stack, 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)) 

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 dataframe:

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

enter image description here

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