2014-10-27 32 views
2

我试图在比例条形图中插入标签:每个分段一个标签,并将每个分段的百分比作为文本。随着thothal我设法做到这一点的帮助:插入与ggplot2和geom_text成比例的条形图中的标签

var1 <- factor(as.character(c(1,1,2,3,1,4,3,2,3,2,1,4,2,3,2,1,4,3,1,2))) 
var2 <- factor(as.character(c(1,4,2,3,4,2,1,2,3,4,2,1,1,3,2,1,2,4,3,2))) 
data <- data.frame(var1, var2) 


dat <- ddply(data, .(var1), function(.) { 
res <- cumsum(prop.table(table(factor(.$var2)))) 
data.frame(lab = names(res), y = c(res)) 
}) 

ggplot(data, aes(x = var1)) + geom_bar(aes(fill = var2), position = 'fill') + 
geom_text(aes(label = lab, x = var1, y = y), data = dat) 

我想有标签的每一级的百分比,而不是级别名称。

enter image description here

任何帮助表示赞赏!

回答

2

您正在告诉geom_text使用var2作为您的y变量。这实际上是as.numeric(data$var2),这意味着范围为1-4。但是,您的barplot使用累计百分比。

因此,你必须之前计算这些位置:

library(ggplot2) 
library(plyr) # just for convenience 
var1 <- factor(as.character(c(1,1,2,3,1,4,3,2,3,2,1,4,2,3,2,1,4,3,1,2))) 
var2 <- factor(as.character(c(1,4,2,3,4,2,1,2,3,4,2,1,1,3,2,1,2,4,3,2))) 
data <- data.frame(var1, var2) 

dat <- ddply(data, .(var1), function(.) { 
    res <- cumsum(prop.table(table(factor(.$var2)))) # re-factor to use only used levels 
    res2 <- prop.table(table(factor(.$var2))) # re-factor to use only used levels 
    data.frame(lab = names(res), y = c(res), lab2 = c(res2)) 
}) 

ggplot(data, aes(x = var1)) + geom_bar(aes(fill = var2), position = 'fill') + 
geom_text(aes(label = round(lab2, 2), x = var1, y = y), data = dat) 

这地方实验室在每个栏的末尾。如果你想让它们稍微抵消一点,你应该在制作dat的时候玩一下。

enter image description here

+0

感谢您的帮助!它完美地工作,但是......这不是我想要做的 - 我已经解释得很糟糕。我在编辑问题,解决了部分问题并添加了一个新部分:事实上,作为标签,我希望每个级别的var2的百分比而不是级别名称。 – 2014-10-27 14:03:37

+1

好吧,不是那么难:只要改变'geom_text(。)'中的'label'参数:'geom_text(aes(label = round(y,2),x = var1,y = y),data = dat) 。也许你不想累积总和,而是各自的百分比,所以你应该调整'dat'的创建。 – thothal 2014-10-27 14:06:57

+0

这给了我累积的百分比...我想有每个细分的百分比!我正在努力解决...... :)但是,再次感谢! – 2014-10-27 14:20:57

2

另一种方式来获得非累积百分比加上中心的标签,以供将来参考:

dat <- ddply(data, .(var1), function(.) { 
good <- prop.table(table(factor(.$var2))) 
res <- cumsum(prop.table(table(factor(.$var2)))) 
data.frame(lab = names(res), y = c(res), good = good, pos = cumsum(good) - 0.5*good) 
}) 

ggplot(data, aes(x = var1)) + geom_bar(aes(fill = var2), position = 'fill') + 
geom_text(aes(label = round(good.Freq, 2), x = var1, y = pos.Freq), data = dat) 

enter image description here