Créer un graphique en barres empilé où chaque stack est mise à l’échelle pour atteindre 100%

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): entrer la description de l'image ici

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()) 

entrer la description de l'image ici

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) ) 

Donne:

entrer la description de l'image ici

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.