簡體   English   中英

使用ggplot2和geom_text在比例條形圖中插入標簽

[英]insert labels in proportional bar chart with ggplot2 and geom_text

我正在嘗試將標簽插入到比例條形圖中:每個分段一個標簽,每個文本的百分比為文本。 在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)

我想為標簽指定每個級別的百分比,而不是級別名稱。

在此處輸入圖片說明

任何幫助表示贊賞!

您正在告訴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的創建中發揮作用。

在此處輸入圖片說明

另一種獲取非累積百分比並以標簽居中的方式,以備將來參考:

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)

在此處輸入圖片說明

我使用以下代碼,對我來說效果很好,請嘗試一下。

 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小數點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM