2012-06-04 18 views
6

Quiero un diagrama como este excepto que cada faceta suma al 100%. En este momento, el grupo M es 0.05 + 0.25 = 0.30 en lugar de 0.20 + 0.80 = 1.00.ggplot: frecuencias relativas de dos grupos

df <- rbind(
    data.frame(gender=c(rep('M',5)), outcome=c(rep('1',4),'0')), 
    data.frame(gender=c(rep('F',10)), outcome=c(rep('1',7),rep('0',3))) 
) 

df 

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 

(y = Usando ..density .. da peores resultados.)

+0

Las respuestas aquí son el método correcto El método ..density ... proporcionado en muchas otras respuestas, http://stackoverflow.com/questions/10064080/plot-relative-frequencies-with-dodged-bar-plots-in-ggplot2, http: // stackoverflow. com/questions/17368223/ggplot2-multi-group-histogram-with-in-group-proportions-rather-than-frequency, http://stackoverflow.com/questions/3695497/ggplot-showing-instead-of-count- in-charts-of-caterical-variables arroja valores que son incorrectos en diversos grados. – russellpierce

Respuesta

9

por lo general hacer esto simplemente puede calcular previamente los valores fuera de ggplot2 y el uso de stat = "identity":

df1 <- melt(ddply(df,.(gender),function(x){prop.table(table(x$outcome))}),id.vars = 1) 

ggplot(df1, aes(x = variable,y = value)) + 
    facet_wrap(~gender, nrow=2, ncol=1) + 
    geom_bar(stat = "identity") 
+0

Esto es correcto. Estoy esperando una respuesta más simple para lo que parece ser un tipo de gráfico relativamente común. :) – Andrew

+0

@andrew - Hago esto * mucho *. Es relativamente fácil crear su propio 'geom', y esto sería una gran adición a las herramientas integradas para ggplot2. – Chase

+0

@Chase Podría estar equivocado, pero creo que tomaría más que un nuevo geom porque (creo) la estética está mapeada a variables _antes de que se realice la facetación. Así que creo que esto podría ser una característica de diseño muy arriba del geom. – joran

16

aquí hay otra forma

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = ..count../sapply(PANEL, FUN=function(x) sum(count[PANEL == x])))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 
+1

¡Qué hack delicioso! – joran

+0

Me gusta cómo es corto, pero cuando trato de cambiar de faceta a posición = esquivar, las alturas suman 100% en todos los grupos (en lugar de en grupos) – Andrew

+0

Ojalá pudiera votar más. – Eduardo