varias superponer los lineas leyenda graficos grafico graficas ggplot etiquetas escala ejes como cambiar barras r ggplot2

superponer - Cómo controlar el pedido de un gráfico de barras apiladas usando identidad en ggplot2



superponer graficas en r ggplot (5)

Usando este data.frame ficticio

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

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

me da "blanco" en la parte superior. y

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

invierte los colores, pero aún 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 apila las barras según su apariencia en el marco de datos. Entonces, la solución a su problema es ordenar sus datos por el factor de relleno en el orden inverso al que desea que aparezca en la leyenda: elemento inferior en la parte superior del marco de datos y elemento superior en la parte inferior:

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

Editar: más ilustración

Usando datos de muestra, creé tres gráficos con diferentes ordenamientos del marco de datos, pensé que más variables de relleno 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)


Por lo que vale, en ggplot2 versión 2.2.1 el orden de la pila ya no está determinado por el orden de las filas 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 trama:


Tengo exactamente el mismo problema hoy. Puede obtener blue en la parte superior usando order=-as.numeric() :

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


Tuve un problema similar y me 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én bien!)


Use el group estética en la llamada a ggplot() . Esto asegura que todas las capas se apilan 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")