los - superponer graficas en r ggplot
Crea barra de gráficos apiladas donde cada escala se escala para sumar al 100% (4)
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):
Por lo tanto, las barras deben estar estandarizadas para que todas las pilas tengan la misma altura y sumas hasta el 100%. Hasta ahora, todo lo que he podido obtener es una barra de barras apiladas (no por ciento), usando:
barplot(as.matrix(df))
¿Alguna ayuda?
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:
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())
Solo necesita dividir cada elemento por la suma 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.
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