Skip to content

R - 箱线图

箱线图(或盒须图)是可视化连续变量分布的强大方式。它们简洁地显示关键统计量:最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值。它们对于比较变量在不同类别之间的分布特别有用。

如今,ggplot2 是在 R 中创建灵活且出版质量的箱线图的标准。

箱线图显示:

  • 中位数(median):盒内的线。
  • 四分位距(IQR):盒子本身,从第 25 百分位数(Q1)延伸到第 75 百分位数(Q3)。
  • 须线(whiskers):从盒子延伸的线,显示数据的范围。通常,它们延伸到距离盒边缘 1.5 倍 IQR 的位置。
  • 异常值(outliers):落在须线范围之外的点。

我们将使用 mtcars 数据集来比较不同汽缸数(cyl)汽车的 mpg(每加仑英里数)分布。

# 我们将使用 tidyverse 中的 ggplot2
# install.packages("tidyverse")
library(ggplot2)
library(dplyr)
# 将分类变量视为因子是一个好习惯
# 这能确保 ggplot2 正确处理它。
input_data <- mtcars %>%
mutate(cyl = factor(cyl))
print(head(input_data[, c('mpg', 'cyl')]))

执行上述代码会产生以下结果:

mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6

我们通过指定 x 轴上的分类变量(cyl)和 y 轴上的连续变量(mpg),然后添加 geom_boxplot 层来构建图表。

# 创建箱线图
boxplot_cyl <- ggplot(data = input_data, aes(x = cyl, y = mpg)) +
geom_boxplot() +
labs(
title = "Distribution of Fuel Efficiency by Number of Cylinders",
x = "Number of Cylinders",
y = "Miles Per Gallon (MPG)"
) +
theme_classic()
# 显示图表
print(boxplot_cyl)
# 将图表保存到文件
ggsave("boxplot.png", width = 7, height = 5)

此代码生成一个清晰的箱线图 boxplot.png,显示随着汽缸数的增加,每加仑英里数的中位数会降低,并且其分布也会发生变化。

我们可以轻松自定义图表外观并添加更多信息。可以添加凹口(notches),以便粗略指示中位数之间差异的显著性;如果两个箱子的凹口不重叠,则有力证据表明它们的中位数不同。我们还可以将变量(或设置固定颜色)映射到 fill 美学属性。

# 创建带凹口和颜色的定制箱线图
boxplot_custom <- ggplot(data = input_data, aes(x = cyl, y = mpg, fill = cyl)) +
geom_boxplot(
notch = TRUE, # 为箱体添加凹口
outlier.color = "red", # 自定义异常点的颜色
outlier.shape = 4
) +
stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "white") + # 添加平均值点
labs(
title = "Mileage Data Comparison",
subtitle = "Notches indicate median confidence intervals. White diamonds are means.",
x = "Number of Cylinders",
y = "Miles Per Gallon (MPG)"
) +
scale_fill_brewer(palette = "Pastel1") + # 使用调色板
theme_gray() +
guides(fill = "none") # 隐藏多余的填充颜色图例
# 显示图表
print(boxplot_custom)
# 将图表保存到文件
ggsave("boxplot_with_notch.png", width = 8, height = 6)

这个高级示例展示了 ggplot2 的几个特性:

  • notch = TRUE 添加了置信区间凹口。
  • 诸如 fill 这样的美学属性在 aes() 中进行映射,以实现数据驱动的着色。
  • stat_summary() 添加了一个额外的层,显示平均值(可能与中位数不同)。
  • scale_fill_brewer() 应用了一个预定义、美观的调色板。