Logo
Section 1 / 8

箱线图

学习如何使用 ggplot2 构建箱线图并修改其各个元素。

导入

箱线图

学习如何使用 ggplot2 构建箱线图并修改其各个元素。

箱线图概述

箱线图(也称箱须图,box and whisker plot)用于通过汇总统计信息可视化多个数据分布。箱线图提供了给定数据变量的五个汇总统计量,包括:

  • 最小值
  • 最大值
  • 中位数
  • 第一四分位数和第三四分位数

简而言之,箱线图常用于展示数据的分布情况,有助于识别异常值并比较不同数据分布。

...
箱线图结构

让我们来分析箱线图的结构:

  • 箱体是箱线图的核心部分。
  • 箱体的下边界代表第一四分位数(Q1),即数据的 25% 百分位数:百分位数是一个用来比较单个分数与群体中其他分数的数值。它表示某个分数超过多少比例的其他分数。例如,如果某人在一次考试中处于第90百分位,说明他的成绩优于参加考试的90%的人。
  • 箱体的上边界代表第三四分位数(Q3),即数据的75%百分位数。
  • 箱体内的一条线代表第二四分位数(Q2),也就是数据的中位数。四分位距(IQR)由从25%到75%百分位数的数据范围表示。
  • 从箱体两端延伸出的线条称为“须线”。它们反映了最小值和最大值。最小值的计算公式为:Q1 – 1.5×IQR,最大值的计算公式为:Q3 + 1.5×IQR。
  • 超出须线范围的所有点,即所有散点,代表异常值。

在 ggplot2 中构建基础箱线图

接下来,我们将使用 MASS 包中的 housing 数据集,该数据集来自哥本哈根住房状况调查的频数表。

要使用 ggplot2 的 geom_boxplot() 函数构建一个基础箱线图,首先导入 MASS 库,并打印内置 housing 数据集的前几行,代码如下:

1library(MASS) 2head(housing)
  • 第1行:使用 R 中的 library 命令导入 MASS 库。
  • 第2行:使用 R 中的 head 命令打印 housing 数据集的前几行。

利用此数据集,我们可以创建一个箱线图,展示每种类型 Type 的住户数量分布。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq))
  • 第1行:使用 ggplot() 函数初始化一个新的 ggplot 对象,并传入 housing 数据集名称。通过 + 操作符向 ggplot 对象添加图层。
  • 第2行:使用 geom_boxplot() 函数创建箱线图。接着使用 aes() 函数将 Type 变量(租赁住房类型)映射到 x 轴,将 Freq 变量(住户数量)映射到 y 轴。

水平箱线图

我们也可以使用 coord_flip() 函数生成水平箱线图,代码如下:

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq)) + 3 coord_flip()
  • 第3行:使用 coord_flip() 函数翻转坐标轴,从而生成水平方向的箱线图。

自定义箱体宽度和粗细

我们还可以通过设置 width 和线宽 lwd 参数来自定义箱线图的外观。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq), 3 width = 0.5, lwd = 1)
  • 第3行:通过 width 和 lwd 参数分别将箱体宽度调整为 0.5,线宽调整为 1,以自定义箱线图的外观。

为箱线图添加颜色填充

与绘制条形图的方法类似,我们可以用自选颜色填充箱线图的箱体。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq), 3 fill = "#1DD3B0")
  • 第3行:使用 fill 参数将箱线图填充为指定颜色。

分组箱线图

我们将使用数据集中的另一个变量来构建分组箱线图。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq, 3 color = Infl))
  • 第3行:通过将 Infl 变量赋给 color 参数,对箱线图进行分组。这会为每个组分配不同的轮廓颜色。Infl 变量用于展示住户对房产管理影响程度的不同。

注意:color 和 fill 参数默认使用 ggplot2 的配色方案(如红色、蓝色、绿色),除非另行指定。

接下来,我们使用 scale_fill_manual() 函数为分组箱线图设置特定颜色。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq, 3 fill = Infl)) + 4 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第3行:将 fill 参数设置为 Infl 变量,表示数据将按 Infl 变量分组。
  • 第4行:使用 scale_fill_manual() 函数为箱线图指定具体的填充颜色。

箱线图中的异常值

默认情况下,箱线图中的异常值点颜色与对应箱体一致。我们可以通过设置不同的颜色和形状来突出显示异常值,代码如下:

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq, fill = Infl), 3 outlier.color = "red", 4 outlier.shape = 3) + 5 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第3–4行:将 outlier.color 设置为 red,使所有异常值以红色显示;同时通过 outlier.shape 参数将异常值形状设为 +(对应 pch 值为 3)。该参数可接受 0 到 25 之间的数值。

我们还可以使用 outlier.size 参数增大异常值的大小,使其在箱线图中更清晰可见。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq, fill = Infl), 3 outlier.color = "red", 4 outlier.shape = 3, 5 outlier.size = 4) + 6 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第5行:通过 outlier.size 参数将异常值大小调整为 4。

为箱线图添加须线

默认情况下,ggplot2 的箱线图会绘制须线,但不会在须线末端添加横帽(误差线)。我们可以通过以下代码手动添加:

1ggplot(housing, aes(x = Type, y = Freq, fill = Infl)) + 2 stat_boxplot(geom = "errorbar") + 3 geom_boxplot() + 4 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第2行:使用 stat_boxplot() 函数,并将 geom 参数设为 errorbar,以添加须线。

调整箱线图的透明度和线型

我们可以使用 alpha 和 linetype 参数分别调整箱线图的透明度和线型。

1ggplot(housing) + 2 geom_boxplot(aes(x = Type, y = Freq, fill = Infl), 3 linetype = 2, 4 alpha = 0.4) + 5 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第3–4行:将 linetype 设置为 2,表示虚线样式;通过 alpha 参数将箱线图的透明度设为 0.4。

为箱线图添加抖动点

在箱线图上叠加原始数据点是一种良好实践,因为它不仅展示了汇总统计信息,还呈现了真实数据分布。

我们可以通过 ggplot2 的 geom_jitter() 函数添加数据点作为额外图层,代码如下:

1ggplot(housing, aes(x = Type, y = Freq, fill = Infl)) + 2 geom_boxplot() + 3 geom_jitter(width = 0.15) + 4 scale_fill_manual(values = c("#0b7a75", "#1DD3B0", "#5DA9E9", "#00487C"))
  • 第3行:使用 geom_jitter() 函数为数据点添加 0.15 的随机抖动,以避免点重叠,使分布更清晰。

附录

小提琴图