我有以下ggplot
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))
我想绘制实际值,以百分比表示(绿色和红色条形的条形图内部,蓝色条形图的正上方,因为它们不适合内部)。有人可以建议如何实现这个目标吗?
答案 0 :(得分: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)))
答案 1 :(得分:0)
在您根据需要定义数据dt
以找到标签位置后添加此项:
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")
将此部分添加到ggplot
命令:
+ geom_text(aes(Age.group, `Proportion`, label = sprintf("%2.1f", `Proportion`)), data=p.m)