如何在ggplot2 boxplot中为每个组添加一些观察并使用组均值?

时间:2013-03-27 14:03:31

标签: r ggplot2 boxplot

我在做y=agex=Patient groups

的基本箱图
age <- ggplot(data, aes(factor(group2), age))  + ylim(15, 80) 
age + geom_boxplot(fill = "grey80", colour = "#3366FF")

我希望你能帮助我解决一些问题:

1)是否可以在每个组箱图上方(但不是在我的组标签所在的X轴上)每组包含一些观察结果,而不必在油漆中执行此操作:)?  我尝试过使用:

age + annotate("text", x = "CON", y = 60, label = "25")

其中CON是第一组,y = 60位于该组的箱线图正上方。但是,该命令不起作用。我认为它有一些事情需要它将x读作连续而非分类变量。

2)虽然有很多关于使用平均值而不是中位数的问题,但我仍然没有找到适合我的代码?

3)同样的问题是你可以在箱线图中包含平均组数据吗?也许使用

age + stat_summary(fun.y=mean, colour="red", geom="point")
然而,

只包括一个平均所在的点。或者再次使用

age + annotate("text", x = "CON", y = 30, label = "30")

其中CON是第1组,y = 30是〜组年龄均值。 知道灵活和丰富的ggplot2语法是多么的我希望有一种更优雅的方式来使用真实的统计数据而不是annotate

任何建议/链接将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:30)

这就像你追求的一样吗?根据要求stat_summary

# function for number of observations 
give.n <- function(x){
  return(c(y = median(x)*1.05, label = length(x))) 
  # experiment with the multiplier to find the perfect position
}

# function for mean labels
mean.n <- function(x){
  return(c(y = median(x)*0.97, label = round(mean(x),2))) 
  # experiment with the multiplier to find the perfect position
}

# plot
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") +
  stat_summary(fun.data = give.n, geom = "text", fun.y = median) +
  stat_summary(fun.data = mean.n, geom = "text", fun.y = mean, colour = "red")

黑色数字是观察数量,红色数字是平均值。 joran的答案向您展示了如何将数字放在方框的顶部 enter image description here

帽子提示:https://stackoverflow.com/a/3483657/1036500

答案 1 :(得分:16)

我认为这是你正在寻找的东西吗?

myboxplot <- ddply(mtcars,
                    .(cyl),
                    summarise,
                    min = min(mpg),
                    q1 = quantile(mpg,0.25),
                    med = median(mpg),
                    q3 = quantile(mpg,0.75),
                    max= max(mpg),
                    lab = length(cyl))
ggplot(myboxplot, aes(x = factor(cyl))) + 
    geom_boxplot(aes(lower = q1, upper = q3, middle = med, ymin = min, ymax = max), stat = "identity") + 
    geom_text(aes(y = max,label = lab),vjust = 0)

enter image description here

我刚刚意识到当你询问平均值时我错误地使用了中位数,但你显然可以使用任何函数来获得middle美学。

答案 2 :(得分:3)

回答第一个问题。 要在框上方显示值,您应提供x值作为数字而不是级别名称。因此,要将值高于第一个值,请给出x=1

data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
   annotate("text",x=1,y=32,label=30)