如何使用geom_boxplot绘制均值而不是中位数?

时间:2018-05-01 06:05:08

标签: r ggplot2

由于一些无聊的原因,我需要创建一个箱线图,其中中间线是平均值而不是中位数。我已经检查了stackoverflow并找到了添加平均线的示例,但不完全是我需要的。我尝试使用stat_smooth但没有骰子。有什么想法吗?

以下代码:

dust <- c(4.5, 3.7, 5, 5.2, 8.5, 6.6, 4.7, 5, 5.7, 4.3, 2.3, 7.6, 5.2, 
          6, 8.7, 7.5, 7.7, 11, 9, 6.5, 8.7, 5, 2.2, 7.5, 7.5, 3.5)

wind <- c("Present", "Absent", "Absent", "Absent", "Absent", "Absent", 
  "Absent", "Absent", "Absent", "Present", "Absent", "Absent", 
  "Present", "Present", "Absent", "Absent", "Absent", "Absent", 
  "Absent", "Present", "Absent", "Present", "Absent", "Absent", 
  "Absent", "Present")

df <- data.frame(dust,wind)

plot <- ggplot(data=df,aes(x=wind,y=dust))+geom_boxplot()+stat_smooth()

plot

2 个答案:

答案 0 :(得分:5)

有几种方法可以做到这一点:

1。使用中间

最简单的是简单地致电:

plot <- ggplot(data = df, aes(y = dust, x = wind)) + 
        geom_boxplot(aes(middle = mean(dust))

2。使用fatten = NULL

您还可以利用fatten中的geom_boxplot()参数。这控制了中线的厚度。如果我们将其设置为NULL,则它不会绘制中间线,我们可以使用stat_summary为平均值插入一行。

plot <- ggplot(data = df, aes(y = dust, x = wind)) + 
  geom_boxplot(fatten = NULL) +
  stat_summary(fun.y = mean, geom = "errorbar", aes(ymax = ..y.., ymin = ..y..),
               width = 0.75, size = 1, linetype = "solid")
print(plot)

使用fatten = NULL

输出

enter image description here

正如您所看到的,上面的方法很好,但是当您评估代码时,它会输出一些警告消息,因为fatten实际上不需要NULL值。

好处是这种方法可能更灵活一点,因为我们基本上是擦除&#34;中间线并添加我们想要的任何东西。例如,我们也可以选择保持中位数,并将平均值添加为虚线。

答案 1 :(得分:4)

ggplot(df) + 
  geom_boxplot(
    aes(
      x = wind, ymin = min(dust), lower = quantile(dust, .25), 
      middle = mean(dust), upper = quantile(dust, .75),
      ymax = max(dust)
    ), stat = "identity"
  )