web-dev-qa-db-fra.com

Fixer l'ordre des facettes dans ggplot

Les données:

type    size    amount  
T   50%     48.4    
F   50%     48.1    
P   50%     46.8    
T   100%    25.9    
F   100%    26.0    
P   100%    24.9    
T   150%    21.1    
F   150%    21.4    
P   150%    20.1    
T   200%    20.8    
F   200%    21.5    
P   200%    16.5

J'ai besoin de tracer un graphique à barres des données ci-dessus à l'aide de ggplot (axe des x -> "type", axe des y -> "montant", groupe par "taille"). Lorsque j'ai utilisé le code suivant, je n'obtiens pas la variable "type" ni la "taille" dans l'ordre indiqué dans les données. S'il vous plaît voir la figure. J'ai utilisé le code suivant pour cela.

 ggplot(temp, 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"))

enter image description here .

Pour résoudre le problème d'ordre, j'ai utilisé une méthode factorielle pour la variable "type" en utilisant ce qui suit. S'il vous plaît voir la figure aussi.

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

enter image description here

Cependant, je ne sais pas comment régler l’ordre de la variable "taille". Ce devrait être 50%, 100%. 150% et 200%.

64
samarasa

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) en facet_grid(.~size_f)

Puis intrigue: enter image description here

Les graphiques sont maintenant dans le bon ordre.

99
Harpal

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 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, à partir de données pouvant être triées de manière judicieuse:

# 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 les facettes, même si vous ne pouvez 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)
1
tim.farkas