Saltar al contenido

Cómo controlar el orden del gráfico de barras apiladas usando la identidad en ggplot2

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

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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:
ingrese la descripción de la imagen aquí

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *