web-dev-qa-db-fra.com

Comment mettre des étiquettes sur geom_bar dans R avec ggplot2

J'aimerais que certaines étiquettes soient empilées sur un graphique geom_bar. Voici un exemple:

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

À présent

table (df $ x)

FALSE  TRUE 
    3     5 

J'aimerais avoir les 3 et 5 au-dessus des deux barres. Encore mieux si je pouvais aussi avoir les valeurs de pourcentage. Par exemple. 3 (37.5%) et 5 (62.5%). Ainsi:
(source: skitch.com )

Est-ce possible? Si c'est le cas, comment?

53
angerman

Comme pour de nombreuses tâches dans ggplot, la stratégie générale consiste à insérer dans un bloc de données ce que vous souhaitez ajouter à l'intrigue de manière à ce que les variables correspondent aux variables et à l'esthétique de votre intrigue. Ainsi, par exemple, vous créeriez un nouveau cadre de données comme ceci:

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

Ainsi, la variable x correspond à la variable correspondante dans df, etc. Ensuite, vous l'incluez simplement avec 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())

Cet exemple ne présentera que les pourcentages, mais vous pouvez également paste ainsi que les comptes via quelque chose comme ceci:

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

Notez que dans la version actuelle de ggplot2, opts est obsolète. Nous utiliserions donc theme et element_blank à présent.

34
joran

Pour tracer du texte sur un ggplot, vous utilisez le geom_text. Mais je trouve utile de résumer les données d’abord en utilisant ddply

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

Puisque les données sont pré-résumées, vous devez vous rappeler de changer, ajoutez le stat="identity" paramètre sur 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

46
Andrie