
本期内容为您介绍的是箱线图的原理和绘制,读完完本期内容,你将会了解以下知识点:
- 什么是箱线图?
- 箱线图的组成?
- 箱线图怎么看?
- 如何绘制箱线图?
1.什么是箱线图?
箱线图(Box Plot),又称为盒须图、盒式图或箱图,是一种用于展示 数据分布 情况的统计图表。箱线图显示了一组数据的中位数(Q2)、上下四分位数(Q1和Q3)、异常值(Outliers)和数据的分布范围。
2.箱线图的组成

如上图所示,箱线图(Box Plot)的主要组成部分包括以下几个要素:
- 1.箱体(Box): 箱体表示数据的四分位数范围,即Q1到Q3。箱体的底边表示第一四分位数 Q1,顶边表示第三四分位数 Q3。箱体内部的横线(图中黄线)通常表示数据的中位数。
- 2.须(Whiskers): 须是 延伸出箱体的线段,表示数据的总体分布范围。通常,须的长度是一定倍数的四分位距(IQR,即Q3 - Q1)。须的末端可能有线段、点或其他标记。
- 3.异常值(Outliers): 超出须的范围的数据点被认为是异常值,用点状标记。异常值是相对于整体数据分布而言较为极端或不寻常的观测值。
- 4.中位数线: 箱体内部的横线通常表示数据的中位数(第二四分位数 Q2)。中位数是数据集的中心位置,即将数据分为两半的点。
- 5.箱体的长度: 箱体的长度表示数据的四分位距(IQR),即 Q3 - Q1。四分位距是中间50%数据的范围,用于衡量数据的离散度。
- 6.上限和下限: 须两端[的两条线](可不画)为上限和下限,上限为1.5*IQR+Q3, 下限为Q1-1.5*IQR。超出上下限的值为异常值。
3.箱线图怎么看?
箱线图是一种有效的工具,可以提供有关数据分布和离群值的多方面信息。通过观察箱线图,可以了解以下方面的信息:
- 数据的中心趋势: 箱体中的横线表示中位数,可以帮助你了解数据的中心位置。箱体的位置也表示了四分位数的位置,从而提供了对数据中心趋势的直观感受。
- 数据的分散程度: 箱体的长度代表数据的四分位距(IQR,即Q3 - Q1),反映了数据的离散程度。较长的箱体表示数据的分布范围较广,而较短的箱体表示数据相对集中。
- 异常值的存在: 箱线图可以帮助你检测离群值。超出箱体的范围的数据点通常被视为异常值,并以点状标记。
- 数据的对称性: 箱线图在中位数附近的箱体部分展示了数据的对称性。如果箱体两侧的长度相等,数据可能是对称分布的。如果长度不相等,可能存在偏斜。
- 数据的分布形状: 箱线图通过须的长度和方向,反映了数据的整体分布形状。长须表示数据分布范围广,而短须表示数据相对集中。
- 不同组之间的比较: 如果你有多个箱线图并排显示,你可以比较它们的中位数、四分位数范围和分布形状,从而了解不同组之间的差异。
偏态 : 偏态(Skewness)是统计学中用于描述概率分布偏斜方向和程度的度量。偏态涉及到数据分布在均值附近的不对称性。如上图呈对称分布的数据(正态分布),中位数线将箱体平分,且到上下限等长,这时数据几乎呈对称分布而不呈现偏态。当中位数线更靠近上限,也就是大多数数据点大于均值,这时数据呈正偏态(右偏态);反之为负偏态(左偏态)。

箱线图中箱体长度越短,方差越小,数据分布越紧凑;同时查看中位数线可以看出不同组中位值的差异和数据的偏态。
总体而言,箱线图是一种强大的可视化工具,能够帮助你更好地理解和比较数据的分布特征,同时识别异常值。
如何绘制箱线图?
常规箱线图
准备数据,设置ABCD四个类别,每个类别由500个呈正态分布的数据点组成。
data <- data.frame(
name=c( rep("A",500), rep("B",500), rep("B",500), rep("C",20), rep('D', 100) ),
value=c( rnorm(500, 10, 5), rnorm(500, 13, 1), rnorm(500, 18, 1), rnorm(20, 25, 4), rnorm(100, 12, 1) )
)
使用R自带的 boxplot 绘图:
boxplot(data$value ~ data$name ,
col=rgb(0.3,0.5,0.4,0.6) ,
ylab="value" ,
xlab="names in desired order")

使用 geom_boxplot()函数 绘制箱线图
library(ggplot2)
library(viridis)
ggplot(data, aes(x=name, y=value, fill=name)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
ggtitle("Boxplot") +
labs(fill="Category")+
xlab("")+
ylab("")+
theme_bw()

将箱线图横过来:
ggplot(data, aes(x=name, y=value, fill=name)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
labs(fill="Category")+
xlab("")+
ylab("")+
theme_bw() +
coord_flip()

带数据点的箱线图
将原始数据点绘制出来,可以看到使用 geom_point 绘制数据点时,全叠在了一条线上,看不清数据分布:
ggplot(data, aes(x=name, y=value, fill=name)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_point(color="black", size=0.4, alpha=0.9) +
ggtitle("Boxplot") +
labs(fill="Category")+
xlab("")+
ylab("")+
theme_bw()

使用 geom_jitter 来解决重叠的问题:
ggplot(data, aes(x=name, y=value, fill=name)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
ggtitle("Boxplot") +
labs(fill="Category")+
xlab("")+
ylab("")+
theme_bw()

分组箱线图
# 模拟数据
variety=rep(LETTERS[1:7], each=40)
treatment=rep(c("high","low"),each=20)
note=seq(1:280)+sample(1:150, 280, replace=T)
data=data.frame(variety, treatment, note)
# grouped boxplot
ggplot(data, aes(x=variety, y=note, fill=treatment)) +
geom_boxplot() + theme_bw()
