Barres d’ordre dans ggplot2 graphique à barres

J’essaie de faire un graphique à barres où la plus grande barre serait la plus proche de l’axe des y et la plus courte serait la plus éloignée. Donc, c’est un peu comme la table que j’ai

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

Donc, j’essaie de construire un graphique à barres qui montrerait le nombre de joueurs en fonction de la position

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

mais le graphique montre la barre de gardien de but d’abord puis la défense, et enfin celle de l’attaquant. Je voudrais que le graphique soit commandé de sorte que la barre de défense soit la plus proche de l’axe des y, celle du gardien de but et enfin celle de l’attaquant. Merci

La clé de la commande consiste à définir les niveaux du facteur dans l’ordre souhaité. Un facteur ordonné n’est pas requirejs; les informations supplémentaires dans un facteur ordonné ne sont pas nécessaires et si ces données sont utilisées dans un modèle statistique, le paramétrage erroné pourrait en résulter – les contrastes polynomiaux ne sont pas corrects pour les données nominales telles que celle-ci.

 ## set the levels in order we want theTable <- within(theTable, Position <- factor(Position, levels=names(sort(table(Position), decreasing=TRUE)))) ## plot ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1) 

figure de barplot

Au sens le plus général, il suffit de définir les niveaux de facteur dans l’ordre souhaité. Si rien n'est spécifié, les niveaux d'un facteur seront sortingés par ordre alphabétique. Cependant, il existe plusieurs façons de modifier l'ordre en une séquence spécifique en fonction de la situation. Par exemple, nous pourrions faire:

 levels(theTable$Position) <- c(...) 

et listez simplement les niveaux dans l'ordre souhaité sur le côté droit. Vous pouvez également spécifier l'ordre des niveaux dans l'appel à factoriser comme ci-dessus:

 theTable$Position <- factor(theTable$Position, levels = c(...)) 

@GavinSimpson: le reorder est une solution puissante et efficace pour cela:

 ggplot(theTable, aes(x=reorder(Position,Position, function(x)-length(x)))) + geom_bar() 

Utiliser scale_x_discrete (limits = ...) pour spécifier l’ordre des barres.

 positions <- c("Goalkeeper", "Defense", "Striker") p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions) 

Je pense que les solutions déjà fournies sont trop détaillées. Une manière plus concise de faire un barplot sortingé par fréquence avec ggplot est

 ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar() 

C’est similaire à ce qu’Alex Brown a suggéré, mais un peu plus court et fonctionne sans définition de fonction.

Mettre à jour

Je pense que mon ancienne solution était bonne à l’époque, mais de nos jours, je préfère utiliser forcats::fct_infreq qui sortinge les niveaux de facteurs par fréquence:

 require(forcats) ggplot(theTable, aes(fct_infreq(Position))) + geom_bar() 

Il vous suffit de spécifier la colonne Position pour qu’elle soit un facteur ordonné où les niveaux sont classés en fonction de leur nombre:

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

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

Ensuite, votre fonction ggplot affichera les barres par ordre décroissant de compte. Je ne sais pas s'il existe une option dans geom_bar pour ce faire sans avoir à créer explicitement un facteur ordonné.

Comme reorder() dans la réponse d’Alex Brown, nous pourrions également utiliser forcats::fct_reorder() . Il sortingera essentiellement les facteurs spécifiés dans le premier argument, en fonction des valeurs du second argument après avoir appliqué une fonction spécifiée (default = median, qui est ce que nous utilisons ici avec une seule valeur par niveau de facteur).

Il est dommage que dans la question de l’OP, l’ordre requirejs soit également alphabétique, car il s’agit de l’ordre de sorting par défaut lorsque vous créez des facteurs. Cachera donc ce que fait réellement cette fonction. Pour être plus clair, je remplacerai “Gardien de but” par “Zoalkeeper”.

 library(tidyverse) library(forcats) theTable <- data.frame( Name = c('James', 'Frank', 'Jean', 'Steve', 'John', 'Tim'), Position = c('Zoalkeeper', 'Zoalkeeper', 'Defense', 'Defense', 'Defense', 'Striker')) theTable %>% count(Position) %>% mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>% ggplot(aes(x = Position, y = n)) + geom_bar(stat = 'identity') 

entrer la description de l'image ici

Une simple réorganisation des facteurs basée sur dplyr peut résoudre ce problème:

 library(dplyr) #reorder the table and reset the factor to that ordering theTable %>% group_by(Position) %>% # calculate the counts summarize(counts = n()) %>% arrange(-counts) %>% # sort by counts mutate(Position = factor(Position, Position)) %>% # reset factor ggplot(aes(x=Position, y=counts)) + # plot geom_bar(stat="identity") # plot histogram 

Je suis d’accord avec zach que compter dans dplyr est la meilleure solution. J’ai trouvé que c’était la version la plus courte:

 dplyr::count(theTable, Position) %>% arrange(-n) %>% mutate(Position = factor(Position, Position)) %>% ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity") 

Cela sera également beaucoup plus rapide que de réorganiser les niveaux de facteur au préalable, car le décompte se fait dans dplyr et non dans ggplot ou à l’aide de table .

En plus de forcats :: fct_infreq, mentionné par @HolgerBrandl, il y a forcats :: fct_rev, qui inverse l’ordre des facteurs.

 theTable <- data.frame( Position= c("Zoalkeeper", "Zoalkeeper", "Defense", "Defense", "Defense", "Striker"), Name=c("James", "Frank","Jean", "Steve","John", "Tim")) p1 <- ggplot(theTable, aes(x = Position)) + geom_bar() p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar() p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar() gridExtra::grid.arrange(p1, p2, p3, nrow=3) 

sortie gplot

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:

 ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) + geom_bar(stat = "identity") 

Le signe moins avant la variable de sorting (-Qty) contrôle le sens du sorting (croissant / décroissant)

Voici quelques données pour tester:

 df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"), Qty = c(7,4,5,1,3,6) ) **Sample data:** Colors Qty 1 Green 7 2 Yellow 4 3 Blue 5 4 Red 1 5 Yellow 3 6 Blue 6 

Lorsque j'ai trouvé ce fil, c'était la réponse que je cherchais. J'espère que c'est utile pour les autres.