Criar um barplot empilhado onde cada pilha é dimensionada para sumr 100%

Eu tenho um data.frame como este:

df <- read.csv(text = "ONE,TWO,THREE 23,234,324 34,534,12 56,324,124 34,234,124 123,534,654") 

Eu quero produzir uma plotagem de barra de porcentagem que se parece com isso (feita no LibreOffice Calc): insira a descrição da imagem aqui

Assim, as barras devem ser padronizadas para que todas as pilhas tenham a mesma altura e sums para 100%. Até agora, tudo o que consegui obter foi um barplot empilhado (não por cento), usando:

 barplot(as.matrix(df)) 

Qualquer ajuda?

Desde que você marcou isso com ggplot2 aqui está uma solução usando esse pacote (versão 0.9.0) além do que você obteve até agora.

Usamos o argumento position de geom_bar set to position = "fill" . Você também pode usar position = position_fill() se quiser usar os argumentos de position_fill() ( vjust e reverse ).

Observe que seus dados estão em um formato ‘amplo’, enquanto que o ggplot2 requer que ele esteja em um formato ‘longo’. Assim, primeiro precisamos melt os dados.

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

insira a descrição da imagem aqui

prop.table é uma ótima maneira amigável de obter proporções de tabelas.

 m <- matrix(1:4,2) m [,1] [,2] [1,] 1 3 [2,] 2 4 

Deixar margem em branco dá-lhe proporções da tabela inteira

  prop.table(m, margin=NULL) [,1] [,2] [1,] 0.1 0.3 [2,] 0.2 0.4 

Dar 1 lhe dá proporções de linha

  prop.table(m, 1) [,1] [,2] [1,] 0.2500000 0.7500000 [2,] 0.3333333 0.6666667 

E 2 é proporções de coluna

  prop.table(m, 2) [,1] [,2] [1,] 0.3333333 0.4285714 [2,] 0.6666667 0.5714286 

Chris Beeley é justo, você só precisa das proporções por coluna. Usando seus dados é:

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

Dá:

insira a descrição da imagem aqui

Você só precisa dividir cada elemento pela sum dos valores em sua coluna.

Isso deve ser suficiente:

 data.perc <- apply(data, 2, function(x){x/sum(x)}) 

Observe que o segundo parâmetro diz apply para aplicar a function fornecida a colunas (usando 1 você aplicaria a linhas). A function anônima, então, passa por cada coluna de dados, uma por vez.