24

我正在做一个基本的箱线图,其中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第 1 组在哪里,并且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是第一组,y = 30是〜组年龄平均值。知道ggplot2语法是多么灵活和丰富,我希望有一种更优雅的方式来使用真实的统计输出而不是annotate.

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

谢谢!!

4

3 回答 3

36

这和你追求的一样吗?与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 的回答向您展示了如何将数字放在框的顶部 在此处输入图像描述

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

于 2013-03-27T14:32:19.917 回答
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)

在此处输入图像描述

我刚刚意识到当您询问平均值时我错误地使用了中位数,但您显然可以使用任何middle您喜欢的美学功能。

于 2013-03-27T14:29:44.910 回答
4

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

data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
   annotate("text",x=1,y=32,label=30)
于 2013-03-27T14:11:44.210 回答