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