使用ggplot2和geom_text在比例条形图中插入标签

时间:2014-10-27 11:47:11

标签: r ggplot2

我正在尝试将标签插入比例条形图:每个段一个标签,每个段的百分比为文本。在thothal的帮助下,我设法做到了:

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

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

您告诉geom_text使用var2作为y变量。实际上这是as.numeric(data$var2),它转换为1-4的范围。但是,您的条形图使用累积百分比。

因此,您必须在以下计算这些职位:

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

时玩arround

enter image description here

答案 1 :(得分: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

答案 2 :(得分:1)

我使用了以下代码,对我来说效果很好,请尝试一下。

 geom_text(aes(label = paste(round(dat2$value,0), "%"),
            vjust = ifelse(value >= 0, -0.05, 1.15)
            ),
        size = 4, position = position_stack(vjust=0.5)
        )

基本上,您需要label = paste(y value, "%")。在我的代码中,dat2是数据文件名;值是图中的Y值。在这种情况下,我将数字四舍五入为0小数点。