在R中的箱图中显示平均值

时间:2020-05-29 01:02:22

标签: r ggplot2

time_pic <- ggplot(data_box, aes(x=Kind, y=TimeTotal, fill=Sitting_Position)) +
  geom_boxplot() 

print(time_pic)

time_pic+labs(title="", x="", y = "Time (Sec)")

我运行了以上代码以获取下图。但是我不知道如何为这张图片上的每个箱线图添加平均值。

This is the current image

已更新。 我尝试过了。

means <- aggregate(TimeTotal ~ Sitting_Position*Kind, data_box, mean)
ggplot(data=data_box, aes(x=Kind, y=TimeTotal, fill=Sitting_Position)) + 
  geom_boxplot() +    
  stat_summary(fun=mean, colour="darkred", geom="point", shape=18, size=3,show_guide = FALSE) + 
  geom_text(data = means, aes(label = TimeTotal, y = TimeTotal + 0.08))

这是现在的样子。两个点在同一行上。并且两个值相互重叠。

My problem

1 个答案:

答案 0 :(得分:3)

正如其他人所说,您可以共享您的数据集以获得更具体的帮助,但是在这种情况下,我认为可以使用虚拟数据集来说明这一点。我正在创建一个看起来与您自己的命名非常相似的代码,因此从理论上讲,您只需插入此代码即可使用。

您在这里最大的需要是控制ggplot2如何分隔data_box$Sitting_Position共享相同data_box$Kind的单独箱形图。围绕x=轴值分离和扩展框的过程称为“躲避”。当您为该几何图形在fill=中提供color=aes()(或其他)美感时,ggplot2知道它会假定您也要根据那个价值。因此,您最初的ggplot()调用在aes()中有fill=Sitting_Position,这意味着geom_boxplot()是“有效的”-它创建了单独的框,这些框的颜色不同并且被“闪避” ”。

创建点和文本时,ggplot2不知道您要“躲避”此数据,即使您确实想躲避,也要基于什么基础来躲避,因为fill=审美对于文本或点几何没有意义。如何解决这个问题?答案是:

  • 提供group=美学,它可以覆盖fill=color=美学的分组,但也可以作为躲避几何元素的基础没有类似的美感。

  • 更清楚地指定您想躲避的方式。这对于准确定位要闪避的所有物体非常重要。否则,您将躲闪一些东西,但距离可能不一样。

这是我将所有这些结合在一起的方式:

# the datasets
set.seed(1234)
data_box <- data.frame(
  Kind=c(rep('Model-free AR',100),rep('Real-world',100)),
  TimeTotal=c(rnorm(50,5.5,1),rnorm(50,5.43,1.1),rnorm(50,4.9,1),rnorm(50,4.7,0.2)),
  Sitting_Position=rep(c(rep('face to face',50),rep('side by side',50)),2)
)
means <- aggregate(TimeTotal ~ Sitting_Position*Kind, data_box, mean)

# the plot
ggplot(data_box, aes(x=Kind, y=TimeTotal)) + theme_bw() +

  # specifying dodge here and width to avoid overlapping boxes
  geom_boxplot(
    aes(fill=Sitting_Position),
    position=position_dodge(0.6), width=0.5
  ) +
  # note group aesthetic and same dodge call for next two objects
  stat_summary(
    aes(group=Sitting_Position),
    position=position_dodge(0.6),
    fun=mean,
    geom='point', color='darkred', shape=18, size=3,
    show.legend = FALSE
  ) +
  geom_text(
    data=means,
    aes(label=round(TimeTotal,2), y=TimeTotal + 0.18, group=Sitting_Position),
    position=position_dodge(0.6)
  )

给你这个:

enter image description here