在箱线图中添加每组观测值的数量

37

根据这个问题:如何在ggplot2箱线图中添加每组观测值数量并使用组均值?,我也想在ggplot箱线图中添加每组观测值数量。但是我已经将颜色添加到映射中。

现有的答案展示了如何调整y轴上的文本位置。我该如何调整x轴上的文本位置?

这是一个最小化的例子来重现我的问题:

library(ggplot2)

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


p <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(am))) + 
    geom_boxplot() +
    stat_summary(fun.data = give.n, geom = "text", fun.y = median)
p

enter image description here

2个回答

28
您可以直接使用 position:
p <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(am))) +  
     geom_boxplot() +
     stat_summary(fun.data = give.n, geom = "text", fun.y = median,
                  position = position_dodge(width = 0.75))
p

enter image description here

position_dodge()函数的width参数控制水平轴上的定位。0.75是最佳位置,可以看看不同分组数量下它是如何工作的:

p2 <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(cyl))) + 
      geom_boxplot() +
      stat_summary(fun.data = give.n, geom = "text", fun.y = median, 
                   position = position_dodge(width = 0.75))
p2

在此输入图片描述


3

不使用stat_summary,您可以使用geom_text。请参考下面的问题:ggplot2在箱线图上添加文本

以下是使用观测数量的示例:

# Create an aggregate of median & count
> cts <- merge(aggregate(mpg ~ cyl + am, mtcars, length), 
               aggregate(mpg ~ cyl + am, mtcars, median), 
               by=c("cyl", "am"))
# Rename the col names to fit with the original dataset..
> names(cts) <- c("cyl", "am", "count", "mpg")
# As alexwhan suggested, position_dodge helps with positioning
# along the x-axis..
> ggplot(mtcars, aes(factor(cyl), mpg, colour = factor(am))) + 
  geom_boxplot(position = position_dodge(width=1.0)) + 
  geom_text(data = cts, aes(label=count), 
            position=position_dodge(width=1.0))

谢谢您的建议。 - Bangyou
geom_text 似乎不能按组计数。您能展示一下如何使用 geom_text 进行计数的代码吗? - arun
geom_text是一个文本标签函数,它不对数据进行任何聚合或汇总统计。但是您可以创建一个数据集的聚合,计算每个组的计数,并将其用作geom_text的输入。我编辑了我的答案以提供一个示例。 - szabad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接