Cómo controlar el orden del gráfico de barras astackdas utilizando identidad en ggplot2

Usando este dummy data.frame

 ts <- data.frame(x=1:3, y=c("blue", "white", "white"), z=c("one", "one", "two")) 

Trato de trazar con la categoría “azul” en la parte superior.

 ggplot(ts, aes(z, x, fill=factor(y, levels=c("blue","white" )))) + geom_bar(stat = "identity") 

enter image description here

me da “blanco” en la parte superior. y

 ggplot(ts, aes(z, x, fill=factor(y, levels=c("white", "blue")))) + geom_bar(stat = "identity") 

enter image description here

invierte los colores, pero todavía me da “blanco” en la parte superior. ¿Cómo puedo obtener “azul” en la parte superior?

He luchado con el mismo problema antes. Parece que ggplot astack las barras según su apariencia en el dataframe. Entonces, la solución a su problema es ordenar los datos por el factor de relleno en el orden inverso al que desea que aparezcan en la leyenda: el elemento inferior en la parte superior del dataframe y el elemento superior en el inferior:

 ggplot(ts[order(ts$y, decreasing = T),], aes(z, x, fill=factor(y, levels=c("blue","white" )))) + geom_bar(stat = "identity") 

enter image description here

Editar: más ilustración

Utilizando datos de muestra, creé tres gráficos con diferentes ordenamientos del dataframe, pensé que con más variables de relleno se aclararían un poco las cosas.

 set.seed(123) library(gridExtra) df <- data.frame(x=rep(c(1,2),each=5), fill_var=rep(LETTERS[1:5], 2), y=1) #original order p1 <- ggplot(df, aes(x=x,y=y,fill=fill_var))+ geom_bar(stat="identity") + labs(title="Original dataframe") #random order p2 <- ggplot(df[sample(1:10),],aes(x=x,y=y,fill=fill_var))+ geom_bar(stat="identity") + labs(title="Random order") #legend checks out, sequence wird #reverse order p3 <- ggplot(df[order(df$fill_var,decreasing=T),], aes(x=x,y=y,fill=fill_var))+ geom_bar(stat="identity") + labs(title="Reverse sort by fill") plots <- list(p1,p2,p3) do.call(grid.arrange,plots) 

enter image description here

Por lo que vale, en ggplot2 versión 2.2.1 el orden de la fila ya no está determinado por el orden de fila en el data.frame. En cambio, coincide con el orden de la leyenda según lo determinado por el orden de los niveles en el factor.

 d <- data.frame( y=c(0.1, 0.2, 0.7), cat = factor(c('No', 'Yes', 'NA'), levels = c('NA', 'Yes', 'No'))) # Original order p1 <- ggplot(d, aes(x=1, y=y, fill=cat)) + geom_bar(stat='identity') # Change order of rows p2 <- ggplot(d[c(2, 3, 1), ], aes(x=1, y=y, fill=cat)) + geom_bar(stat='identity') # Change order of levels d$cat2 <- relevel(d$cat, 'Yes') p3 <- ggplot(d, aes(x=1, y=y, fill=cat2)) + geom_bar(stat='identity') grid.arrange(p1, p2, p3, ncol=3) 

Resulta en la siguiente gráfica: enter image description here

Tengo exactamente el mismo problema hoy. Puedes ponerte blue arriba usando order=-as.numeric() :

 ggplot(ts, aes(z, x, fill=factor(y, levels=c("blue","white")), order=-as.numeric(y))) + geom_bar(stat = "identity") 

Use el group aethetic en la llamada ggplot() . Esto asegura que todas las capas estén astackdas de la misma manera.

 series <- data.frame( time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)), type = rep(c('a', 'b', 'c', 'd'), 4), value = rpois(16, 10) ) ggplot(series, aes(time, value, group = type)) + geom_col(aes(fill = type)) + geom_text(aes(label = type), position = "stack") 

Tuve un problema similar y cambié cambiando el nivel del factor. pensé en compartir el código:

 library(reshape2) library(ggplot2) group <- c( "1", "2-4", "5-9", "10-14", "15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49" ) xx <- factor(group, levels(factor(group))[c(1, 4, 11, 2, 3, 5:10)]) method.1 <- c(36, 14, 8, 8, 18, 1, 46, 30, 62, 34, 34) method.2 <- c(21, 37, 45, 42, 68, 41, 16, 81, 51, 62, 14) method.3 <- c(37, 46, 18, 9, 16, 79, 46, 45, 70, 42, 28) elisa.neg <- c(12, 17, 18, 6, 19, 14, 13, 13, 7, 4, 1) elisa.eq <- c(3, 6, 3, 14, 1, 4, 11, 13, 5, 3, 2) test <- data.frame(person = xx, "Mixture Model" = method.1, "Censoring" = method.3, "ELISA neg" = elisa.neg, "ELISA eqiv" = elisa.eq) melted <- melt(test, "person") melted$cat <- ifelse(melted$variable == "Mixture.Model", "1", ifelse(melted$variable == "Censoring", "2", "3")) melted$variable = factor(melted$variable, levels = levels(melted$variable)[c(1, 2, 4,3 )]) ## This did the trick of changing the order ggplot(melted, aes(x = cat, y = value, fill = variable)) + geom_bar(stat = 'identity') + facet_wrap(~ person) + theme(axis.ticks.x=element_blank(), axis.text.x=element_blank()) + labs(title = "My Title", y = "Per cent", x = "Age Group", fill = "") 

(Lo siento, estos son mis datos, no los reproduje usando los datos de la publicación original, ¡espero que esté bien!)