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

use*_*363 21 r ggplot2 boxplot

我正在做一个基本的箱子图,其中y=agex=Patient groups

age <- ggplot(data, aes(factor(group2), age))  + ylim(15, 80) 
age + geom_boxplot(fill = "grey80", colour = "#3366FF")
Run Code Online (Sandbox Code Playgroud)

我希望你能用一些东西来帮助我:

1)是否可以在每个组框图上面包括每组的观察次数(但不是在我的组标签所在的X轴上),而不必在油漆中执行此操作:)?我尝试过使用:

age + annotate("text", x = "CON", y = 60, label = "25")
Run Code Online (Sandbox Code Playgroud)

CON第一组在哪里,就在y = 60这个组的箱线图上方.但是,该命令不起作用.我认为它有一些事情可以做,它x是一个连续的而不是一个分类的变量.

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

3)在同样的问题上你有没有办法在箱线图中包含平均组数据?也许用

age + stat_summary(fun.y=mean, colour="red", geom="point")
Run Code Online (Sandbox Code Playgroud)

然而,它只包括一个平均所在的点.或者再次使用

age + annotate("text", x = "CON", y = 30, label = "30")
Run Code Online (Sandbox Code Playgroud)

哪一个CON是第一组,y = 30是〜组年龄均值.知道如何灵活和丰富的ggplot2语法,我希望有一种更优雅的方式来使用真实的统计输出而不是annotate.

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

谢谢!!

Ben*_*Ben 33

这就像你追求的那样吗?随着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")
Run Code Online (Sandbox Code Playgroud)

黑色数字是观察数量,红色数字是平均值.joran的答案向您展示了如何将数字放在方框的顶部 在此输入图像描述

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

  • 有关此答案的变体,包括如何使用"n = 11"等进行注释,请参阅此处:http://stackoverflow.com/a/15720769/1036500 (3认同)

jor*_*ran 18

我想这可能是你想要的?

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我刚刚意识到当你询问平均值时我错误地使用了中位数,但你显然可以使用任何功能来满足middle你的美学要求.