J'essaie de faire un graphique à barres où la plus grande barre serait la plus proche de l'axe y et la barre la plus courte serait la plus éloignée. Donc, c'est un peu comme le tableau que j'ai
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 selon la position
p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)
mais le graphique montre d'abord la barre du gardien de but, puis la défense et enfin celle de l'attaquant. Je voudrais que le graphique soit ordonné de sorte que la barre de défense soit la plus proche de l'axe y, celui du gardien de but et enfin celui de l'attaquant. Merci
ggplot2
, pas sur l'OPRéponses:
La clé de la commande est de définir les niveaux du facteur dans l'ordre souhaité. Un facteur ordonné n'est pas requis; les informations supplémentaires dans un facteur ordonné ne sont pas nécessaires et si ces données sont utilisées dans n'importe quel modèle statistique, un mauvais paramétrage pourrait en résulter - les contrastes polynomiaux ne sont pas appropriés pour des données nominales comme celle-ci.
Dans le sens le plus général, nous devons simplement définir les niveaux de facteur pour qu'ils soient dans l'ordre souhaité. S'il n'est pas spécifié, les niveaux d'un facteur seront triés par ordre alphabétique. Vous pouvez également spécifier l'ordre de niveau dans l'appel à factoriser comme ci-dessus, et d'autres moyens sont également possibles.
la source
within
, il n'y a pas besoin d'utilisertheTable$Position
, et vous pouvez simplement le fairesort(-table(...))
pour un ordre décroissant.-
vous utilisez, car il est beaucoup plus facile d'obtenir l'intentiondecreasing = TRUE
que de remarquer-
dans tout le reste du code.levels(theTable$Position) <- c(...)
conduit à un comportement indésirable où les entrées réelles de la trame de données sont réorganisées, et pas seulement les niveaux du facteur. Voir cette question . Vous devriez peut-être modifier ou supprimer ces lignes?levels<-
. Je vais éditer cette partie, au moins provisoirement.levels<-()
aujourd'hui. C'est quelque chose d'il y a 8 ans et je ne me souviens pas si les choses étaient différentes à l'époque ou si j'avais simplement tort, mais quoi qu'il en soit, c'est faux et devrait être effacé! Merci!@GavinSimpson:
reorder
est une solution puissante et efficace pour cela:la source
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Utilisez
scale_x_discrete (limits = ...)
pour spécifier l'ordre des barres.la source
Je pense que les solutions déjà fournies sont trop verbeuses. Une façon plus concise de faire un barplot trié en fréquence avec ggplot est
C'est similaire à ce qu'Alex Brown a suggéré, mais un peu plus court et fonctionne sans définition de fonction quelconque.
Mettre à jour
Je pense que mon ancienne solution était bonne à l'époque, mais de nos jours, je préfère utiliser le
forcats::fct_infreq
tri des niveaux de facteur par fréquence:la source
Comme
reorder()
dans la réponse d'Alex Brown, nous pourrions également utiliserforcats::fct_reorder()
. Il triera fondamentalement les facteurs spécifiés dans le 1er argument, selon les valeurs dans le 2ème argument après avoir appliqué une fonction spécifiée (par défaut = médiane, c'est ce que nous utilisons ici car il n'y a qu'une seule valeur par niveau de facteur).Il est dommage que dans la question de l'OP, l'ordre requis soit également alphabétique car c'est l'ordre de tri par défaut lorsque vous créez des facteurs, donc cela masquera ce que cette fonction fait réellement. Pour que ce soit plus clair, je remplacerai "Gardien de but" par "Zoalkeeper".
la source
Une simple réorganisation basée sur dplyr des facteurs peut résoudre ce problème:
la source
Il vous suffit de spécifier que la
Position
colonne doit être un facteur ordonné où les niveaux sont classés par leur nombre:(Notez que le
table(Position)
produit un compte de fréquence de laPosition
colonne.)Ensuite, votre
ggplot
fonction affichera les barres par ordre décroissant de comptage. Je ne sais pas s'il y a une optiongeom_bar
pour le faire sans avoir à créer explicitement un facteur ordonné.la source
reorder()
la bibliothèque de statistiques accomplit la même tâche.reorder()
dans ce cas? Le facteur nécessitant une réorganisation doit être réorganisé par une fonction de lui-même et j'ai du mal à voir un bon moyen de le faire.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
c'est une manière, et une autrewith(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
mais ce sont tout aussi compliqués ...sort
plutôt queorder
reorder
est habile à le faire. Je suis d'accord pour cette question que quelque chose de plus impliqué est nécessaire. Désolé pour la confusion.En plus de forcats :: fct_infreq, mentionné par @HolgerBrandl, il existe forcats :: fct_rev, qui inverse l'ordre des facteurs.
la source
Je suis d'accord avec zach que compter au sein de dplyr est la meilleure solution. J'ai trouvé que c'était la version la plus courte:
Cela sera également beaucoup plus rapide que de réorganiser les niveaux de facteur à l'avance, car le comptage est effectué dans dplyr et non dans ggplot ou using
table
.la source
Si les colonnes du graphique proviennent d'une variable numérique comme dans le cadre de données ci-dessous, vous pouvez utiliser une solution plus simple:
Le signe moins avant la variable de tri (-Qté) contrôle le sens du tri (croissant / décroissant)
Voici quelques données à tester:
Quand j'ai trouvé ce fil, c'était la réponse que je cherchais. J'espère que c'est utile pour les autres.
la source
Une autre alternative consiste à réorganiser pour ordonner les niveaux d'un facteur. Dans l'ordre croissant (n) ou décroissant (-n) en fonction du nombre. Très similaire à celui utilisé
fct_reorder
dans leforcats
package:Ordre décroissant
Ordre croissant
Trame de données:
la source
Puisque nous ne regardons que la distribution d'une seule variable ("Position") par opposition à la relation entre deux variables , alors peut-être un histogramme serait le graphique le plus approprié. ggplot a geom_histogram () qui le rend facile:
Utilisation de geom_histogram ():
Je pense que geom_histogram ( ) est un peu excentrique car il traite différemment les données continues et discrètes.
Pour les données continues , vous pouvez simplement utiliser geom_histogram () sans paramètres. Par exemple, si nous ajoutons un vecteur numérique "Score" ...
et utilisez geom_histogram () sur la variable "Score" ...
Pour les données discrètes comme "Position", nous devons spécifier une statistique calculée calculée par l'esthétique pour donner la valeur y pour la hauteur des barres en utilisant
stat = "count"
:Remarque: Curieusement et confusément, vous pouvez également utiliser
stat = "count"
pour des données continues et je pense que cela fournit un graphique plus esthétique.Modifications : réponse étendue en réponse aux suggestions utiles de DebanjanB .
la source
J'ai trouvé très ennuyeux de
ggplot2
ne pas proposer de solution «automatique» pour cela. C'est pourquoi j'ai créé labar_chart()
fonction dansggcharts
.Par défaut,
bar_chart()
trie les barres et affiche un tracé horizontal. Pour changer cet ensemblehorizontal = FALSE
. De plus,bar_chart()
supprime l '«espace» disgracieux entre les barres et l'axe.la source