Arreglando el orden de las facetas en ggplot

97

Datos:

df <- data.frame(
    type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
    size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
    amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

Necesito trazar un gráfico de barras de los datos anteriores usando ggplot (eje x -> type, eje y -> amount, agrupar por size). Cuando utilicé el siguiente código, no obtengo la variable typeni tampoco sizeen el orden que se muestra en los datos. Consulte la figura. He usado el siguiente código para eso.

 ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_bar(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

ingrese la descripción de la imagen aquí .

Para solucionar el problema del pedido, he utilizado un método de factor para la variable "tipo" utilizando lo siguiente. Consulte también la figura.

temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P")) 

ingrese la descripción de la imagen aquí

Sin embargo, ahora no sé cómo arreglar el orden de la variable size. Debe ser 50%, 100%. 150% y 200%.

samarasa
fuente

Respuestas:

148

Haga que su tamaño sea un factor en su marco de datos al:

temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))

Entonces cambia el facet_grid(.~size)afacet_grid(.~size_f)

Luego traza: ingrese la descripción de la imagen aquí

Los gráficos están ahora en el orden correcto.

Harpal
fuente
7

Aquí hay una solución que mantiene las cosas dentro de una cadena de tuberías dplyr. Ordena los datos por adelantado y luego usa mutate_at para convertir a un factor. Modifiqué ligeramente los datos para mostrar cómo se puede aplicar esta solución en general, dados los datos que se pueden ordenar con sensatez:

# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
                    size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
                    size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
                    amount=c(48.4, 48.1, 46.8, 
                             25.9, 26.0, 24.9,
                             20.8, 21.5, 16.5,
                             21.1, 21.4, 20.1))

temp %>% 
  arrange(size_num) %>% # sort
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor

  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

También puede aplicar esta solución para organizar las barras dentro de las facetas, aunque solo puede elegir un único orden preferido:

    temp %>% 
  arrange(size_num) %>%
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
  arrange(desc(amount)) %>%
  mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)


  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)
tim.farkas
fuente