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

Posted

技术标签:

【中文标题】如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组平均值?【英文标题】:How to add a number of observations per group and use group mean in ggplot2 boxplot? 【发布时间】:2013-03-17 15:37:16 【问题描述】:

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

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

谢谢!!

【问题讨论】:

箱线图通常有最小、下、中、上分位数,最后是最大值。您已经有了 .25、.5 和 .75 分位数。这些信息还不够丰富吗? 这是我被要求的格式。 【参考方案1】:

这和你所追求的一样吗? 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://***.com/a/3483657/1036500

【讨论】:

有关此答案的变体,包括如何使用n = 11 等进行注释,请参见此处:***.com/a/15720769/1036500【参考方案2】:

我想这也许就是你要找的东西?

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 美学的任何函数。

【讨论】:

抱歉,最后一个问题。是否可以更改组的顺序?不幸的是,我对数字或数据驱动的订单不感兴趣。我能想到的唯一方法是重新编码组变量。您的帮助将不胜感激!再次感谢!【参考方案3】:

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

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

【讨论】:

嗨!万分感谢。我最初实际上尝试了数字/级别,但由于某种原因没有任何效果。现在好了,非常感谢。 annotate 命令非常适合修复定位问题!非常感谢

以上是关于如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中为 plotly boxplot 添加标签?

R语言使用ggplot2包使用geom_boxplot函数绘制基础分组水平箱图(boxplot)实战

R语言使用ggplot2包使用geom_boxplot函数绘制基础分组缺口箱图(notch boxplot)实战

如何在 R 中为 plotly boxplots 自定义悬停文本

R语言ggplot2可视化时间序列数据:ggplot2可视化在时间轴上添加按月的箱图(boxplot)

R语言ggplot2可视化箱图(boxplot)自定义设置抑制箱图中异常值数据点的输出(removes boxplot outliers in the ggplot2 graph)