J’ai un data.frame comme ceci:
df <- read.csv(text = "ONE,TWO,THREE 23,234,324 34,534,12 56,324,124 34,234,124 123,534,654")
Je veux produire un graphique en barres de pourcentage qui ressemble à ceci (créé dans LibreOffice Calc):
Ainsi, les barres doivent être standardisées de manière à ce que toutes les stacks aient la même hauteur et les sums à 100%. Jusqu’à présent, tout ce que j’ai pu savoir, c’est un barplot empilé (pas de pourcentage), en utilisant:
barplot(as.masortingx(df))
De l’aide?
Comme vous avez tagué ceci avec ggplot2, voici une solution utilisant ce package (version 0.9.0) en plus de ce que vous avez obtenu jusqu’à présent.
Nous utilisons l’argument de position
de geom_bar
mis à position = "fill"
. Vous pouvez également utiliser position = position_fill()
si vous voulez utiliser les arguments de position_fill()
( vjust
et reverse
).
Notez que vos données sont dans un format «large», alors que ggplot2
nécessite un format «long». Il faut donc d’abord faire melt
les données.
dat <- read.table(text = " ONE TWO THREE 1 23 234 324 2 34 534 12 3 56 324 124 4 34 234 124 5 123 534 654",sep = "",header = TRUE) #Add an id variable for the filled regions library(reshape) datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind')) library(scales) ggplot(datm,aes(x = variable, y = value,fill = ind)) + geom_bar(position = "fill",stat = "identity") + # or: # geom_bar(position = position_fill(), stat = "identity") scale_y_continuous(labels = percent_format())
prop.table est une manière sympathique d’obtenir des proportions de tables.
m <- matrix(1:4,2) m [,1] [,2] [1,] 1 3 [2,] 2 4
Si vous laissez la marge vierge, vous obtenez des proportions de la table entière
prop.table(m, margin=NULL) [,1] [,2] [1,] 0.1 0.3 [2,] 0.2 0.4
Donner 1 vous donne des proportions de rangée
prop.table(m, 1) [,1] [,2] [1,] 0.2500000 0.7500000 [2,] 0.3333333 0.6666667
Et 2 est les proportions des colonnes
prop.table(m, 2) [,1] [,2] [1,] 0.3333333 0.4285714 [2,] 0.6666667 0.5714286
Chris Beeley est rigoureux, vous n’avez besoin que des proportions par colonne. Utiliser vos données est:
your_masortingx<-( rbind( c(23,234,324), c(34,534,12), c(56,324,124), c(34,234,124), c(123,534,654) ) ) barplot(prop.table(your_matrix, 2) )
Il suffit de diviser chaque élément par la sum des valeurs de sa colonne.
Cela devrait suffire:
data.perc <- apply(data, 2, function(x){x/sum(x)})
Notez que le deuxième paramètre indique apply
pour appliquer la fonction fournie aux colonnes (en utilisant 1, vous l'appliqueriez aux lignes). La fonction anonyme reçoit alors chaque colonne de données, une à la fois.