Crea barra de gráficos astackdas donde cada escala se escala para sumr al 100%

Tengo un 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") 

Quiero producir un gráfico de porcentaje de barras que se ve así (hecho en LibreOffice Calc): enter image description here

Por lo tanto, las barras deben estar estandarizadas para que todas las stacks tengan la misma altura y sums hasta el 100%. Hasta ahora, todo lo que he podido obtener es una barra de barras astackdas (no por ciento), usando:

 barplot(as.matrix(df)) 

¿Alguna ayuda?

Desde que etiquetó esto con ggplot2 aquí hay una solución que usa ese paquete (versión 0.9.0) además de lo que ha obtenido hasta ahora.

Usamos el argumento de position de geom_bar set to position = "fill" . También puede usar position = position_fill() si desea usar los argumentos de position_fill() ( vjust e reverse ).

Tenga en cuenta que sus datos están en un formato ‘ancho’, mientras que ggplot2 requiere que estén en un formato ‘largo’. Por lo tanto, primero necesitamos melt los datos.

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

enter image description here

prop.table es una forma agradable de obtener proporciones de tablas.

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

Dejar el margen en blanco le da proporciones de toda la tabla

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

Darle 1 te da proporciones de fila

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

Y 2 son proporciones de columna

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

Chris Beeley es estricto, solo necesitas las proporciones por columna. Usando sus datos es:

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

Da:

enter image description here

Solo necesita dividir cada elemento por la sum de los valores en su columna.

Hacer esto debería ser suficiente:

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

Tenga en cuenta que el segundo parámetro dice apply para aplicar la función proporcionada a las columnas (con 1 se aplicaría a las filas). La función anónima, entonces, pasa cada columna de datos, una a la vez.