2014-04-27 171 views
4

我想在這個boxplot上爲2個組添加男性和女性平均年齡的標籤。到目前爲止,我只能通過小組來完成,而不是通過性別和小組來完成。在ggplot2 boxplot上添加多個標籤

我的數據幀:

Age=c(60, 62, 22, 24, 21, 23) 
Sex=c("f", "m", "f","f","f","m") 
Group=c("Old", "Old", "Young", "Young", "Young", "Young") 

aging<-data.frame(Age, Sex, Group) 

而對於圖的命令:

ggplot(data=aging, aes(x=Group, y=Age))+geom_boxplot(aes(fill=Sex)) 
+geom_text(data =aggregate(Age~Group,aging, mean), 
aes(label =round(Age,1), y = Age + 3), size=6) 

Graph with 2 groups and 2 genders per group

+0

你能提供一些最小的數據,所以我們可以直接測試代碼嗎? – ilir

+0

@ilir我在編輯後的版本 – Alba

+0

@Alba [this](http://stackoverflow.com/a/13370258/640783)上添加了一些數據可能會有所幫助。 –

回答

8

你或許應該保存爲清楚起見單獨對象上的彙總數據,並在geom_text()選項使用position=position_dodge()

aging.sum = aggregate(Age ~ Group + Sex, aging, mean) 

ggplot(data=aging, aes(x=Group, y=Age, fill=Sex)) + 
    geom_boxplot(position=position_dodge(width=0.8)) + 
    geom_text(data=aging.sum, aes(label=round(Age,1), y = Age + 3), 
      size=6, position=position_dodge(width=0.8)) 

播放與width,直到你滿意的結果。請注意,我將fill=Sex放在全局aes定義中,因此它也適用於文本標籤。

編輯:在@ user20650建議添加position_dodge()geom_boxplot()爲正確對齊。

+0

是的,非常感謝您的幫助,我正在尋找 – Alba

+0

@ user20650謝謝,添加到答案。 – ilir

+0

@ilir;好東西 – user20650

6

如果你想要的平均年齡性別和組接性別需在彙總報表中。

示例 - 這是你想要的嗎?

p <- ggplot(data=mtcars, aes(x=factor(vs), y=mpg, fill=factor(am))) + 
          geom_boxplot(position = position_dodge(width=0.9)) 

a <- aggregate(mpg ~ vs + am , mtcars, function(i) round(mean(i))) 

p + geom_text(data = a, aes(label = mpg), 
            position = position_dodge(width=0.9)) 

+1

@Alba;你可以在'geom_text'調用中使用'vjust'參數來調整文本的y位置。加'vjust = 1'。 – user20650

+0

謝謝你,Ilir上面,你給我我正在尋找的答案 – Alba