El tutorial o código que verás en este post es la solución más eficiente y efectiva que encontramos a tu duda o problema.
Solución:
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 aparezcan en la leyenda: el elemento inferior en la parte superior del marco de datos y el 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 órdenes del marco de datos, pensé que más variables de relleno harían las cosas un poco más claras.
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 la versión 2.2.1 de ggplot2, el orden de la pila ya no está determinado por el orden de las filas en el marco de datos. En su lugar, 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)
Da como resultado la siguiente gráfica:
Utilizar el group
estético en el ggplot()
llamada. 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")
Sección de Reseñas y Valoraciones
Si te gusta el tema, tienes la libertad de dejar una noticia acerca de qué le añadirías a este tutorial.