2014-10-27 70 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