2012-07-19 12 views
10

Estoy tratando de anotar un gráfico de barras con el porcentaje de observaciones que caen en ese cubo, dentro de a faceta. Esta pregunta está muy relacionada con esta pregunta: Show % instead of counts in charts of categorical variables pero la introducción de facetas introduce una arruga. La respuesta a la pregunta relacionada es utilizar stat_bin w/geom texto y luego hacer que las etiquetas se construye como así:Condition a ..count .. suma en la variable de faceting

stat_bin(geom="text", aes(x = bins, 
     y = ..count.., 
     label = paste(round(100*(..count../sum(..count..)),1), "%", sep="") 
     ) 

Esto funciona bien para una trama ONU facetas. Sin embargo, con las facetas, esta suma (... cuenta) se suma a toda la colección de observaciones sin tener en cuenta las facetas. El siguiente diagrama ilustra el problema: tenga en cuenta que los porcentajes no suman el 100% dentro de un panel.

enter image description here

Aquí la realidad de código para la figura anterior:

g.invite.distro <- ggplot(data = df.exp) + 
geom_bar(aes(x = invite_bins)) + 
facet_wrap(~cat1, ncol=3) + 
stat_bin(geom="text", aes(x = invite_bins, 
     y = ..count.., 
     label = paste(round(100*(..count../sum(..count..)),1), "%", sep="") 
     ), 
     vjust = -1, size = 3) + 
    theme_bw() + 
scale_y_continuous(limits = c(0, 3000)) 

ACTUALIZACIÓN: Según la petición, aquí hay un pequeño ejemplo de re-producción de la edición:

df <- data.frame(x = c('a', 'a', 'b','b'), f = c('c', 'd','d','d')) 
ggplot(data = df) + geom_bar(aes(x = x)) + 
stat_bin(geom = "text", aes(
     x = x, 
     y = ..count.., label = ..count../sum(..count..)), vjust = -1) + 
facet_wrap(~f) 

enter image description here

+1

Interesante pregunta, si usted nos dio los datos para reproducir el error que sería más probable que obtenga una respuesta. –

+0

Lo siento, debería haber hecho eso. Hay un ejemplo ahora. –

+0

También he enfrentado este problema, sería genial si ggplot se encargará de esto ... –

Respuesta

11

Actualización tegeom_bar requiere stat = identity.

A veces es más fácil obtener resúmenes fuera de la llamada a ggplot.

df <- data.frame(x = c('a', 'a', 'b','b'), f = c('c', 'd','d','d')) 

# Load packages 
library(ggplot2) 
library(plyr) 

# Obtain summary. 'Freq' is the count, 'pct' is the percent within each 'f' 
m = ddply(data.frame(table(df)), .(f), mutate, pct = round(Freq/sum(Freq) * 100, 1)) 

# Plot the data using the summary data frame 
ggplot(data = m, aes(x = x, y = Freq)) + 
    geom_bar(stat = "identity", width = .7) + 
    geom_text(aes(label = paste(m$pct, "%", sep = "")), vjust = -1, size = 3) + 
    facet_wrap(~ f, ncol = 2) + theme_bw() + 
    scale_y_continuous(limits = c(0, 1.2*max(m$Freq))) 

enter image description here