2017-04-14 83 views
1

在下面的圖表中,我希望觀察的數量(在這種情況下爲40)疊加在每個箱形圖上。如果有fill美學,我下面的代碼不起作用。文本需要水平調整(在這種情況下,左側1箇中心,右側1個),以便正確覆蓋相應的箱形圖。ggplot2 boxplot stat_summary按組別排列的文字

dt <- data.table(
    x = factor(rep(1:2, each=120)) 
    , f = rep(letters[1:3], 40) 
    , y = c(rnorm(120, 1:3), rnorm(120, 1:3*2)) 
) 
table(dt$x, dt$f) 

+--------------+ 
|  a b c | 
+--------------+ 
| 1 40 40 40 | 
| 2 40 40 40 | 
+--------------+ 

frequencyAnnotation <- function(x) { 
    c(y = (quantile(x, .75, names = F) + median(x))/2, label=length(x)) 
} 
ggplot(dt, aes(x=x, y=y, fill=f)) + 
    geom_boxplot() + 
    stat_summary(fun.data = frequencyAnnotation, geom='text') 

enter image description here

回答

1

,當您使用參數填寫=您的箱線圖都躲開了,你必須添加position_dodge()stat_summary()通話。

ggplot(dt, aes(x=x, y=y, fill=f)) + 
     geom_boxplot() + 
     stat_summary(fun.data = frequencyAnnotation, geom='text', 
        position = position_dodge(width = 0.75)) 
+0

謝謝!我還沒遇到'position_dodge()'。這不是一個大問題,但是有沒有辦法避免硬編碼'width = 0.75'?即你可以通過編程來完成嗎? – Synergist

+1

對於箱形圖和文本,如果更改x和f級別的數量,則這個0.75不會改變。 –

+0

這是神奇的。有一個簡單的解釋,爲什麼?如果沒有,謝謝反正 - 它效果很好! – Synergist