在ggplot2中,boxplot行的结尾代表什么?

时间:2011-02-09 15:32:52

标签: r ggplot2 boxplot

我无法找到箱线图的线端点代表的描述。

例如,这里是线条结束的上方和下方的点值。 enter image description here

(我意识到盒子的顶部和底部分别是第25和第75百分位,中心线是第50个)。我假设,因为线上方和下方有点,它们不代表最大/最小值。

4 个答案:

答案 0 :(得分:59)

箱图末尾的“点”代表异常值。确定点是否是异常值有许多不同的规则,但R和ggplot使用的方法是“1.5规则”。如果数据点是:

  • 小于Q1 - 1.5 * IQR
  • 大于Q3 + 1.5 * IQR
然后,这一点被归类为“异常值”。胡须定义为:

上部晶须= min(max(x),Q_3 + 1.5 * IQR)

降低晶须=最大值(min(x),Q_1 - 1.5 * IQR)

其中IQR = Q_3 - Q_1,框长度。所以上部晶须位于最大x值的较小和Q_3 + 1.5 IQR, 而较低的晶须位于最小x值的较大和Q_1 - 1.5 IQR。

其他信息

  • 有关替代离群值规则,请参阅wikipedia boxplot页面。
  • 实际上有多种计算分位数的方法。看一下`?quantile来描述不同的方法。

示例

考虑以下示例

> set.seed(1)
> x = rlnorm(20, 1/2)#skewed data
> par(mfrow=c(1,3))
> boxplot(x, range=1.7, main="range=1.7")
> boxplot(x, range=1.5, main="range=1.5")#default
> boxplot(x, range=0, main="range=0")#The same as range="Very big number"

这给出了以下情节: enter image description here

当我们将范围从1.7减小到1.5时,我们减少了晶须的长度。但是,range=0是一种特殊情况 - 它相当于“range = infinity”

答案 1 :(得分:13)

我认为ggplot使用标准默认值,与boxplot相同:“胡须延伸到最极端的数据点,不超过盒子长度的1.5倍”

请参阅:boxplot.stats

答案 2 :(得分:2)

P1IMSA Tutorial 8 - Understanding Box and Whisker Plots视频提供了(Tukey)方框和胡须图的逐步解释。

在4分23秒时,我解释了晶须末端的含义及其与1.5 * IQR的关系。

虽然视频中显示的图表是使用D3.js而不是R渲染的,但其解释与所提到的箱形图的R实现相符。

答案 3 :(得分:0)

正如@TemplateRex 在评论中强调的那样,ggplot 不会在 IQR 的上/下四分位加/减 1.5 倍处绘制胡须。它实际上以 max(x[x < Q3 + 1.5 * IQR]) 和 min(x[x > Q1 + 1.5 * IQR]) 绘制它们。例如,这是使用 geom_boxplot 绘制的图,其中我在值 Q1 - 1.5*IQR 处添加了一条虚线:

enter image description here

Q1 = 52

Q3 = 65

Q1 - 1.5 * IQR = 52 - 13*1.5 = 32.5(虚线)

下须 = min(x[x > Q1 + 1.5 * IQR]) = 35(其中 x 是用于创建箱线图的数据,异常值位于 x = 27)。

MWE 请注意,这不是我用来生成上面图像的确切代码,但它已经结束了。

library("mosaic") # For favstats()

df <-  c(54, 41, 55, 66, 71, 50, 65, 54, 72, 46, 36, 64, 49, 64, 73, 
         52, 53, 66, 49, 64, 44, 56, 49, 54, 61, 55, 52, 64, 60, 54, 59, 
         67, 58, 51, 63, 55, 67, 68, 54, 53, 58, 26, 53, 56, 61, 51, 51, 
         50, 51, 68, 60, 67, 66, 51, 60, 52, 79, 62, 55, 74, 62, 59, 35, 
         67, 58, 74, 48, 53, 40, 62, 67, 57, 68, 56, 75, 55, 41, 50, 73, 
         57, 62, 61, 48, 60, 64, 53, 53, 66, 58, 51, 68, 69, 69, 58, 54, 
         57, 65, 78, 70, 52, 59, 52, 65, 70, 53, 57, 72, 47, 50, 70, 41, 
         64, 59, 58, 65, 57, 60, 70, 46, 40, 76, 60, 64, 51, 38, 67, 57, 
         64, 51)
df <- as.data.frame(df)


Q1 <- favstats(df)$Q1
Q3 <- favstats(df)$Q3

IQR <- Q3 - Q1

lowerlim <- Q1 - 1.5*IQR
upperlim <- Q3 + 1.5* IQR

boxplot_Tukey_lower <- min(df[df > lowerlim])
boxplot_Tukey_upper <- max(df[df < upperlim])



ggplot(df, aes(x = "", y = df)) +
  stat_boxplot(geom ='errorbar', width = 0.5) +
  geom_boxplot() + 
  geom_hline(yintercept = lowerlim, linetype = "dashed") +
  geom_hline(yintercept = upperlim, linetype = "dashed")