1

Possible Duplicate:
Showing data values on stacked bar chart in ggplot2

I have the following ggplot

enter image description here

dt <- structure(list(Age.group = structure(1:5, .Label = c("0-29 yrs", "30-49 yrs", "50-64 yrs", "65-79 yrs", "80+ years"), class = "factor"),     Rx.Brufen = c(4.91767279891635, 24.849329416471, 39.384529665324,     42.0512030516413, 45.0282816501013), Brufen.C.I = c(9.49857407873833,     10.4942035949849, 11.0935906177108, 16.7322917304551, 18.5232702433842   ), Brufen.declined = c(1.25219908256281, 1.1156980249761,     1.18510539437499, 0.73845826559561, 1.00121613129538)), .Names = c("Age.group", "Rx.Brufen", "Brufen.C.I", "Brufen.declined"), row.names = c(NA, -5L), class = "data.frame")

dt.m <- melt(dt, 1)

colnames(dt.m)[2] <- "Rx"
colnames(dt.m)[3] <- "Proportion"
ggplot(dt.m, aes(x=Age.group,y=Proportion, fill=Rx)) +
    geom_bar() +
    labs(x="Age Group", y="Proportion %",fill = "") +
    theme(legend.position=c(.5, .9), legend.direction = "horizontal" ) +
    ylim(c(0,100))

I would like to plot the actual values, as percentages (inside the bars for the green and red bars, and just above for the blue ones, since they won't fit inside). Can someone advise how to achieve this ?

Community
  • 1
  • 1
Robert Long
  • 5,722
  • 5
  • 29
  • 50

2 Answers2

3
p <-  ggplot(dt.m, aes(x=Age.group,y=Proportion, fill=Rx)) +
geom_bar() +
labs(x="Age Group", y="Proportion %",fill = "") +
theme(legend.position=c(.5, .9), legend.direction = "horizontal" ) +
ylim(c(0,100))

library(plyr)
dt.m.text <- ddply(dt.m, .variables="Age.group", transform, text.y=cumsum(Proportion))
p+geom_text(data=dt.m.text, aes(x = Age.group, y = text.y, label = round(Proportion)))
#close

dt.m.text <- ddply(dt.m, .variables="Age.group", transform, text.y = cumsum(Proportion)-1/2*Proportion)
p+geom_text(data=dt.m.text, aes(x=Age.group,y=text.y, label=round(Proportion)))

#manually increase Brufen.declined
up <-  dt.m.text[dt.m.text$Rx=="Brufen.declined","text.y"]
dt.m.text[dt.m.text$Rx=="Brufen.declined","text.y"] <- up + 1
p+geom_text(data=dt.m.text, aes(x=Age.group,y=text.y, label=round(Proportion)))
jem77bfp
  • 1,270
  • 11
  • 13
0

Add this one after you have defined your data dt to find the label positions - as you need:

p=dt
p[,4]=p[,4]+p[,3]+p[,2]
p[,3]=p[,3]/2+p[,2]
p[,2]=p[,2]/2
p.m = melt(p)
colnames(p.m)[2:3]=c("Rx","Proportion")

And add this part to your ggplot command:

+ geom_text(aes(Age.group, `Proportion`, label = sprintf("%2.1f", `Proportion`)), data=p.m) 
Ali
  • 9,440
  • 12
  • 62
  • 92