我找不到关于箱线图线的端点代表什么的描述。
例如,这里是线结束位置上方和下方的点值。
(我意识到盒子的顶部和底部是第 25 和第 75 个百分位数,而中心线是第 50 个)。我假设,因为线上方和下方的点不代表最大/最小值。
箱线图末尾的“点”代表异常值。确定一个点是否为异常值有许多不同的规则,但 R 和 ggplot 使用的方法是“1.5 规则”。如果一个数据点是:
然后该点被归类为“异常值”。晶须定义为:
上须线 = min(max(x), Q_3 + 1.5 * IQR)
下须 = max(min(x), Q_1 – 1.5 * IQR)
其中 IQR = Q_3 – Q_1,盒子长度。因此,上晶须位于最大 x 值和 Q_3 + 1.5 IQR 中的较小者处,而下晶须位于最小 x 值和 Q_1 – 1.5 IQR中的较大者处。
附加信息
例子
考虑以下示例
> 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"
这给出了以下情节:
当我们将范围从 1.7 减小到 1.5 时,我们会减少晶须的长度。然而,range=0
是一个特例——它相当于“range=infinity”
我认为 ggplot 使用标准默认值,与 boxplot 相同:“胡须延伸到最极端的数据点,该数据点不超过距离盒子长度的 [1.5] 倍”
P1IMSA 教程 8 - 了解箱线图视频提供了 (Tukey) 箱线图和晶须图的可视化分步说明。
在 4m 23s,我解释了胡须末端的含义及其与 1.5*IQR 的关系。
尽管视频中显示的图表是使用 D3.js 而不是 R 呈现的,但它的解释与提到的箱线图的 R 实现相吻合。
正如@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 处添加了一条虚线:
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")