【问题标题】:ggplot2 box-whisker plot: show 95% confidence intervals & remove outliersggplot2 箱须图:显示 95% 置信区间并去除异常值
【发布时间】:2014-02-14 03:28:34
【问题描述】:

我想要一个类似于下图的箱形图。但不是默认值,我想呈现 (1) 95% 置信区间(2) 没有异常值

95% 置信区间可能意味着 (i) 扩展框并移除胡须,或 (ii) 仅具有均值和胡须并移除框。或者,如果人们对在这样的图中呈现 95% 置信区间有其他想法,我愿意接受建议。最终目标是在同一图上显示跨多个类别的数据的均值和置信区间。

set.seed(1234)
df <- data.frame(cond = factor( rep(c("A","B"), each=200) ), 
                   rating = c(rnorm(200),rnorm(200, mean=.8))
ggplot(df, aes(x=cond, y=rating, fill=cond)) + geom_boxplot() + 
    guides(fill=FALSE) + coord_flip()

图片及代码来源:http://www.cookbook-r.com/Graphs/Plotting_distributions_(ggplot2)/

【问题讨论】:

  • 这不是一个好主意,因为它不再是一个箱形图,而且很可能会造成混淆。您可以轻松地将第 1 和第 3 分位数置于置信区间之外(这是样本大小的函数) - 所以晶须会被盒子覆盖!为什么不直接使用 geom_crossbar 或 geom_errorbar 或 geom_linerange?无论如何,这基本上是答案 - 只需使用不同的 geom's 构建您自己的箱线图元素。
  • 我同意@AndyW 的观点,即不应改变箱线图的基本原理。 geom_errorbargeom_violin 的组合可能适合您的目的。
  • @Jaap 不知何故我错过了这个!感谢您的 ping。

标签: r plot ggplot2


【解决方案1】:

我使用以下内容来显示 95% 的间隔。根据我读到的内容,盒子和胡须的用法并不少见,但这不是默认设置,因此您需要清楚地说明您在图表中显示的内容。

quantiles_95 <- function(x) {
  r <- quantile(x, probs=c(0.05, 0.25, 0.5, 0.75, 0.95))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}

ggplot(df, aes(x=cond, y=rating, fill=cond)) +
    guides(fill=F) +
    coord_flip() +
    stat_summary(fun.data = quantiles_95, geom="boxplot")

不要使用geom_boxplot,而是使用stat_summary 和指定您要使用的限制的自定义函数:

  • "ymin"是下晶须的下限
  • "lower"是下框的下限
  • "middle" 是方框的中间(通常是中间值)
  • "upper"是上框的上限
  • "ymax" 是上晶须的上限。

在提供的函数 (quantiles_95) 中,内置 quantile 函数与自定义 probs 参数一起使用。如给定的那样,胡须将跨越 90% 的数据:从底部的 5% 到顶部的 95%。与往常一样,这些框将跨越中间两个四分位数,从 25% 到 75%。

您始终可以更改自定义函数以选择不同的分位数(甚至不使用分位数),但您需要非常小心。正如评论中所指出的,当人们看到一个盒子和胡须图时,会有一定的期望。如果你使用相同的形状图来传达不同的信息,你很可能会混淆人们。

如果你想去掉胡须,使"ymin" 等于"lower""ymax" 等于"upper"。如果你想要所有的胡须没有盒子,设置"upper""lower"都等于"middle"(或者只使用geom_errorbars)。

【讨论】:

  • 我认为这显示了 95% 的区间,而不是 95% 的 置信度 区间。我已经用Rmisc::CI 函数和统计测试验证了这个方法,它确实没有可视化预期的置信度区间。
【解决方案2】:

您可以通过将大小设置为 0 来隐藏异常值:

ggplot(df, aes(x=cond, y=rating, fill=cond)) + 
  geom_boxplot(outlier.size = 0) + 
  guides(fill=FALSE) + coord_flip()

您可以使用stat_summary 函数将均值添加到绘图中:

ggplot(df, aes(x=cond, y=rating, fill=cond)) + 
  geom_boxplot(outlier.size = 0) + 
  stat_summary(fun.y="mean", geom="point", shape=23, size=4, fill="white") +
  guides(fill=FALSE) + 
  coord_flip()

【讨论】:

  • 这里没有提到置信区间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多