web-dev-qa-db-fra.com

Ordre des barres empilées inversées

Je crée un graphique à barres empilées en utilisant ggplot comme ceci:

plot_df <- df[!is.na(df$levels), ] 
ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")

Ce qui me donne quelque chose comme ça:

enter image description here

Comment inverser l'ordre des barres empilées elles-mêmes, de sorte que le niveau 1 se trouve en bas et le niveau 5 en haut de chaque barre?

J'ai vu un certain nombre de questions à ce sujet (par exemple Comment contrôler l'ordre des graphiques à barres empilés en utilisant l'identité sur ggplot2 ) et la solution commune semble être de réorganiser la trame de données par ce niveau comme ce que ggplot utilise le déterminer l'ordre

J'ai donc essayé de réorganiser en utilisant dplyr:

plot_df <- df[!is.na(df$levels), ] %>% arrange(desc(levels))

Cependant, l'intrigue est la même. Cela ne semble pas non plus faire de différence si j'arrange par ordre croissant ou décroissant

Voici un exemple reproductible:

group <- c(1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4)
levels <- c("1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4","5","5","5","5","1","1","1","1")
plot_df <- data.frame(group, levels)

ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")
24
Simon

Les notes de version de ggplot2 Version 2.2.0 sur Barres empilables suggèrent :

Si vous souhaitez empiler dans l'ordre inverse, essayez forcats::fct_rev()

library(ggplot2)   # version 2.2.1 used    
plot_df <- data.frame(group = rep(1:4, 6),
                      levels = factor(c(rep(1:5, each = 4), rep(1, 4))))
ggplot(plot_df, aes(group, fill = forcats::fct_rev(levels))) + 
  geom_bar(position = "fill")

Reverse levels

Voici le tracé d'origine :

ggplot(plot_df, aes(group, fill = levels)) + 
  geom_bar(position = "fill")

Original plot

Ou, en utilisant position_fill(reverse = TRUE) comme suggéré par alistaire dans son commentaire :

ggplot(plot_df, aes(group, fill = levels)) + 
  geom_bar(position = position_fill(reverse = TRUE))

enter image description here

Notez que les niveaux (couleurs) dans la légende ne sont pas dans le même ordre que dans les barres empilées.

46
Uwe