385 votes

Ordre des barres dans le graphique à barres de ggplot2

J'essaie de créer un graphique à barres où la barre la plus grande serait la plus proche de l'axe des y et la barre la plus courte la plus éloignée. C'est un peu comme le tableau que je possède

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

J'essaie donc de construire un graphique à barres qui montrerait le nombre de joueurs en fonction de leur position.

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

mais le graphique montre d'abord la barre du gardien, puis celle de la défense, et enfin celle de l'attaquant. Je voudrais que le graphique soit ordonné de manière à ce que la barre de la défense soit la plus proche de l'axe des y, puis celle du gardien de but et enfin celle de l'attaquant. Merci

17 votes

ggplot ne peut-il pas les réorganiser pour vous sans avoir à manipuler le tableau (ou le cadre de données) ?

3 votes

@MattO'Brien Je trouve incroyable que cela ne soit pas fait en une seule commande simple.

0 votes

@Zimano Dommage que ce soit ce que vous retirez de mon commentaire. Mon observation portait sur les créateurs de ggplot2 pas l'OP

20voto

Prasad Chalasani Points 9020

Il vous suffit de préciser le Position pour être un facteur commandé où les niveaux sont ordonnés par leur nombre :

theTable <- transform( theTable,
       Position = ordered(Position, levels = names( sort(-table(Position)))))

(Notez que le table(Position) produit un compte de fréquence de la Position colonne.)

Alors votre ggplot affichera les barres dans l'ordre décroissant de leur nombre. Je ne sais pas s'il y a une option dans la fonction geom_bar pour faire cela sans avoir à créer explicitement un facteur ordonné.

0 votes

Je n'ai pas entièrement analysé ton code là-haut, mais je suis presque sûr que reorder() de la bibliothèque des statistiques accomplit la même tâche.

0 votes

@Chase comment proposez-vous d'utiliser reorder() dans ce cas ? Le facteur nécessitant un réordonnancement doit être réordonné par une fonction de lui-même et j'ai du mal à trouver un bon moyen de le faire.

0 votes

ok, with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x)))) est d'une certaine manière, et d'une autre with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x)))) mais ceux-ci sont tout aussi alambiqués...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X