Como colocar labels sobre geom_bar em R com ggplot2

Eu gostaria de ter algumas etiquetas empilhadas em cima de um gráfico geom_bar . Aqui está um exemplo:

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

Agora

mesa (df $ x)

 FALSE TRUE 3 5 

Eu gostaria de ter o 3 e 5 no topo das duas barras. Ainda melhor se eu pudesse ter os valores percentuais também. Por exemplo, 3 (37.5%) e 5 (62.5%) . Igual a:

Isso é possível? Se sim, como?

Como acontece com muitas tarefas no ggplot, a estratégia geral é colocar o que você gostaria de adicionar ao gráfico em um quadro de dados de forma que as variables ​​correspondam às variables ​​e à estética do seu gráfico. Por exemplo, você criaria um novo quadro de dados como este:

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

Para que a variável x corresponda à variável correspondente em df e assim por diante. Então você simplesmente inclui 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 exemplo irá plotar apenas as porcentagens, mas você pode paste as contagens também por meio de algo como isto:

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

Note que na versão atual do ggplot2, o opts é obsoleto, então usaríamos theme e element_blank agora.

Para plotar o texto em um ggplot você usa o geom_text . Mas acho útil resumir os dados primeiro usando o ddply

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

Como os dados são pré-resumidos, você precisa se lembrar de alterar o parâmetro stat="identity" 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() ) 

insira a descrição da imagem aqui