web-dev-qa-db-fra.com

Réorganisation des barres dans le barplot de R ()

Ce que je veux réaliser est exactement le même que celui qui a déjà été demandé ici (et en particulier en utilisant les graphiques de base de R, pas des packages comme ggplot ou lattice): Commande des barres dans barplot ()

Cependant, les solutions qui y sont proposées ne semblent pas fonctionner pour moi. Ce dont j'ai besoin est le suivant. Supposons que j'ai ceci:

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:length(num)])
data <- data.frame(num, cat)

Si je génère un barplot en utilisant barplot(data$num), voici ce que j'obtiens:

Maintenant, je veux réorganiser les barres selon data$cat. En suivant le lien que j'ai mentionné ci-dessus, j'ai essayé la réponse acceptée mais j'ai eu une erreur:

num2 <- factor(num, labels = as.character(cat))
Error in factor(num, labels = as.character(cat)) : invalid 'labels'; length 10 should be 1 or 9

Ensuite, j'ai également essayé l'autre réponse:

num <- as.factor(num)
barplot(table(num))

Mais voici ce que j'ai obtenu:

Donc, dans ce cas particulier, qui est légèrement différent de cette question, comment dois-je commander le barplot pour que les barres soient définies par data$num Mais ordonnées selon data$cat?

9
Juddy

Je reçois ce qui suit,

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)
barplot(data[order(data[,1],decreasing=TRUE),][,1],names.arg=data[order(data[,1],decreasing=TRUE),][,2])

Le code ci-dessus utilise deux fois la fonction order () (voir les commentaires ci-dessous). Pour éviter cela, les résultats du data.frame commandé peuvent être stockés dans un nouveau data.frame et cela peut être utilisé pour générer le barplot.

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)
data2  <- data[order(data[,1],decreasing=TRUE),]
barplot(data2[,1],names.arg=data2[,2])
5
user1945827

vous pouvez utiliser ggplot pour ce faire

library("ggplot2")
num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)    
ggplot(data,aes(x= reorder(cat,-num),num))+geom_bar(stat ="identity")

Le résultat est le suivant: enter image description here

Utilisation des fonctions de base

df <- data[order(data$num,decreasing = TRUE),]
 barplot(df$num,names.arg = df$cat)

enter image description here

10
ArunK

Vous pouvez également utiliser les éléments suivants si vous ne souhaitez pas placer vos données dans un nouveau cadre de données. Un peu plus simple.

barplot(sort(data$num, decreasing = TRUE))
0
lambertj