2011-06-23 157 views
35

Me gustaría tener algunas etiquetas apiladas encima de un gráfico geom_bar. He aquí un ejemplo:Cómo poner etiquetas sobre geom_bar en R con ggplot2

df <- data.frame(x=factor(c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE))) 
ggplot(df) + geom_bar(aes(x,fill=x)) + opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(),axis.title.x=theme_blank(),legend.title=theme_blank(),axis.title.y=theme_blank()) 

Ahora

mesa (df $ x)

FALSE TRUE 
    3  5 

me gustaría tener el 3 y 5 en la parte superior de los dos bares Mejor aún si pudiera tener los valores porcentuales también. P.ej. 3 (37.5%) y 5 (62.5%). De la misma manera:

¿Esto es posible? ¿Si es así, cómo?

+2

Agregar números o texto en la parte superior de las barras distorsiona cómo el ojo ve la comparación en alturas. Ver [esta discusión] (http://tolstoy.newcastle.edu.au/R/e2/help/07/08/22858.html) en R-help. –

Respuesta

28

Al igual que con muchas tareas en ggplot, la estrategia general es colocar lo que desea agregar a la trama en un marco de datos de manera tal que las variables coincidan con las variables y la estética de su trazado. Así, por ejemplo, necesitará crear una nueva trama de datos de esta manera:

dfTab <- as.data.frame(table(df)) 
colnames(dfTab)[1] <- "x" 
dfTab$lab <- as.character(100 * dfTab$Freq/sum(dfTab$Freq)) 

por lo que la variable x coincide con la variable correspondiente en df, y así sucesivamente. Entonces sólo tiene que incluirlo usando geom_text:

ggplot(df) + geom_bar(aes(x,fill=x)) + 
    geom_text(data=dfTab,aes(x=x,y=Freq,label=lab),vjust=0) + 
    opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(), 
     axis.title.x=theme_blank(),legend.title=theme_blank(), 
     axis.title.y=theme_blank()) 

Este ejemplo trazar sólo los porcentajes, pero se puede paste juntos los recuentos, así a través de algo como esto:

dfTab$lab <- paste(dfTab$Freq,paste("(",dfTab$lab,"%)",sep=""),sep=" ") 

Tenga en cuenta que en la versión actual de ggplot2, opts está en desuso, por lo que ahora usaríamos theme y element_blank.

36

Para graficar texto en un ggplot, usa el geom_text. Pero me resulta útil resumir los datos utilizando primero ddply

dfl <- ddply(df, .(x), summarize, y=length(x)) 
str(dfl) 

Dado que los datos son pre-resumida, es necesario recordar que cambiar agregar la stat="identity" parámetro para geom_bar:

ggplot(dfl, aes(x, y=y, fill=x)) + geom_bar(stat="identity") + 
    geom_text(aes(label=y), vjust=0) + 
    opts(axis.text.x=theme_blank(), 
     axis.ticks=theme_blank(), 
     axis.title.x=theme_blank(), 
     legend.title=theme_blank(), 
     axis.title.y=theme_blank() 
) 

enter image description here

Cuestiones relacionadas