Correction de l'ordre des facettes dans ggplot

94

Les données:

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

J'ai besoin de tracer un bargraph des données ci-dessus en utilisant ggplot (axe x -> type, axe y -> amount, grouper par size). Lorsque j'ai utilisé le code suivant, je n'obtiens pas la variable typeet ainsi que sizedans l'ordre indiqué dans les données. Veuillez consulter la figure. J'ai utilisé le code suivant pour cela.

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

entrez la description de l'image ici .

Pour résoudre le problème de commande, j'ai utilisé une méthode factorielle pour la variable «type» en utilisant ce qui suit. Veuillez également consulter la figure.

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

entrez la description de l'image ici

Cependant, maintenant je ne sais pas comment fixer l'ordre de la variable size. Ce devrait être 50%, 100%. 150% et 200%.

samarasa
la source

Réponses:

142

Faites de votre taille un facteur dans votre dataframe en:

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

Puis changez le facet_grid(.~size)enfacet_grid(.~size_f)

Puis tracez: entrez la description de l'image ici

Les graphiques sont maintenant dans le bon ordre.

Harpal
la source
7

Voici une solution qui garde les choses dans une chaîne de tuyaux dplyr. Vous triez les données à l'avance, puis utilisez mutate_at pour convertir en un facteur. J'ai légèrement modifié les données pour montrer comment cette solution peut être appliquée de manière générale, étant donné les données qui peuvent être triées de manière raisonnable:

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

Vous pouvez également appliquer cette solution pour organiser les barres dans des facettes, bien que vous ne puissiez choisir qu'un seul ordre préféré:

    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
la source