R 中的 boxplot():如何制作 BoxRStudio 中的绘图

⚡ 智能摘要

BoxR 语言中的箱线图使用 ggplot2 中的 geom_boxplot() 函数,通过中位数、四分位数、须线和异常值来概括数值分布。本教程将基于空气质量数据集构建箱线图,并添加颜色、点、抖动、缺口和组比较等图层。

  • 📐 五数概括: 箱体跨越第一四分位数到第三四分位数,横线标记中位数,须线延伸至四分位距的 1.5 倍。
  • 🧱 基本语法: ggplot(df, aes(x = group, y = value)) + geom_boxplot() 会为 group 的每个级别生成一个箱线图。ping 因子。
  • ???? 异常样式: outlier.colour、outlier.shape 和 outlier.size 控制如何绘制须线以外的点。
  • 💠 显示观察结果: geom_jitter() 会改变重叠区域的位置。ping 指向两侧,揭示每个方框后面的样本量。
  • 📉 缺口 Box是: notch = TRUE 表示绘制中位数的置信区间,且不重叠。ping 刻度线表示实际差异。
  • ???? 的Grouping: 地图ping geom_boxplot() 函数内部的 fill 函数会将每个类别分成几个并排的方框。

Box在 R 中绘制图形

R 中的 boxplot()

R 中的 boxplot() 有助于按四分位数可视化数据分布并检测异常值的存在。您可以使用 ggplot2 库中的几何对象 geom_boxplot() 在 R 中绘制 boxplot()。

我们将使用 airquality 数据集,在 R 语言中使用 ggplot 包来介绍 boxplot() 函数。该数据集记录了 1973 年 5 月至 9 月纽约市的每日空气质量测量数据,包含 153 个观测值。我们将使用以下变量:

  • 臭氧:数值变量
  • 风:数值变量
  • 月份:5月至9月。数值变量

在绘制方框之前,最好先了解方框的每个部分分别代表什么。

如何阅读 Box 图表:四分位数、四分位距和异常值

箱线图中的每个元素都代表五数概括中的一个数字。了解每个元素代表什么,就能将图表从装饰性工具转化为分析工具。

  • 下铰链: 第一四分位数,Q1。25% 的观测值位于其下方。
  • 中线: 第二个四分位数。它在方框内的位置揭示了偏度:一条线向下移动表示数据呈右偏分布。
  • 上铰链: 第三四分位数,Q3。75% 的观测值低于它。
  • Box 高度: 四分位距 (IQR) = Q3 – Q1,它包含了数据的中间一半,是衡量数据离散程度的标准稳健指标。
  • 胡须: 它们延伸至最极端的观测值,但仍在最近铰链的四分位距 (IQR) 的 1.5 倍以内。它们并非最小值和最大值。
  • 超出胡须范围的点: 根据 1.5 IQR 规则,将观测值标记为异常值。

两点注意事项。首先,这里的“异常值”是一个统计标记,而非错误:在臭氧浓度等偏态分布中,出现高值是正常的,不应删除。其次,箱线图会掩盖分布的形状,因此两个箱线图相同的组可能代表截然不同的数据。添加抖动点(如下所示)可以避免这种情况。

Box R语言中的绘图、直方图和小提琴图

这三张图表都描述了数值分布,但每张图表都揭示了其他图表所隐藏的信息。

标准 Box 情节 直方图 小提琴情节
作品 中位数、四分位数、异常值 每个区间内的频率 完整密度曲线
Rev多个峰 没有
标记异常值 是的,明确地。 仅视觉上 不直接
比较多个组 (卓越)等级 尴尬 良好
需要一种调校方式 没有 是的,箱数 是的,带宽
ggplot2 对象 geom_boxplot() geom_histogram() geom_violin()

一种常见的折衷方案是在小提琴图内绘制一个窄箱线图,这样既能保留密度形状,又能将四分位数汇总信息放在同一个图表中。参见 直方图教程 针对分箱比较部分。

创建 Box 情节

在 R 中开始创建第一个 boxplot() 之前,您需要按如下方式处理数据:

  • 步骤 1:导入数据
  • 第 2 步:删除不必要的变量
  • 步骤 3:将月份转换为有序因子
  • 步骤 4:创建一个新的分类变量,将每个月分为三个部分:开始、中间和结束。
  • 步骤 5:删除缺失的观测值

所有这些步骤都是通过 dplyr 和管道运算符 %>% 完成的。

library(dplyr)
library(ggplot2)
# Step 1
data_air <- airquality %>%

#Step 2
select(-c(Solar.R, Temp)) %>%

#Step 3
mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), 
       
#Step 4 
day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))

一个好的做法是使用函数 glimpse() 检查数据的结构。

glimpse(data_air)

输出:

## Observations: 153
## Variables: 5
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ...
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6...
## $ Month   <ord> May, May, May, May, May, May, May, May, May, May, May,...
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...

Ozone 和 Solar.R 都包含 NA 值。由于 geom_boxplot() 函数会默默地删除这些值并打印警告,因此最好显式地删除它们。

# Step 5
data_air_nona <-data_air %>% na.omit()	

基本箱线图

现在绘制臭氧按月分布图。

# Store the graph
box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone))
# Add the geometric object box plot
box_plot +
    geom_boxplot()

Code 说明

  • 存储图表以供进一步使用
    • 箱线图:基础图存储在 box_plot 对象中,这样您就可以稍后添加图层而无需重复整个调用。
  • 添加几何对象
    • 您将数据集 data_air_nona 传递给 ggplot boxplot。
    • 在 aes() 参数中,添加 x 轴和 y 轴。
    • + 号表示您希望 R 继续阅读代码。通过拆分代码,可以提高代码的可读性。
    • 使用 geom_boxplot() 创建箱线图

输出:

基础版 Box 情节

改变图表的一侧

您可以翻转图表的一侧。

box_plot +
  geom_boxplot()+
  coord_flip()

Code 说明

  • box_plot:使用您存储的图表。这样可以避免每次向图表添加新信息时重写所有代码。
  • geom_boxplot(): 绘制箱线图
  • coord_flip():翻转图形的一侧

输出:

改变图表的一侧

更改异常值的颜色

您可以更改异常值的颜色、形状和大小。

box_plot +
    geom_boxplot(outlier.colour = "red",
        outlier.shape = 2,
        outlier.size = 3) +
    theme_classic()

Code 说明

  • outlier.colour=”red”: 控制异常值的颜色
  • outlier.shape=2:改变异常值的形状。2 表示三角形
  • outlier.size=3:更改三角形的大小。数值越大,标记越大。

输出:

改变异常值的颜色

添加汇总统计数据

您可以叠加汇总统计信息,例如组均值,而箱线图本身并不显示该统计信息。

box_plot +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

Code 说明

  • stat_summary() 函数会在箱线图上方添加一个计算统计量。
  • 参数 `fun` 控制返回哪个统计量。这里返回的是均值。请注意,旧版本代码使用了 `fun.y`,ggplot2 在 3.3.0 版本中已弃用该函数。
  • 注意:还有其他统计数据,例如最小值和最大值。同一张图表中可以显示多个统计数据
  • geom = “point”:用点绘制平均值
  • size=3:点的大小
  • color =”steelblue”: 点的颜色

输出:

添加汇总统计数据

Box 用点绘制

接下来,在方框上方添加一个散点图图层。每个点代表一个观测值,这样就可以看到每个方框背后的样本量。

box_plot +
    geom_boxplot() +
    geom_dotplot(binaxis = 'y',
        dotsize = 1,
        stackdir = 'center') +
    theme_classic()

Code 说明

  • geom_dotplot() 函数在每个区间内为每个观测值绘制一个点,并进行堆叠。
  • binaxis='y':更改 y 轴上点的位置。默认情况下,x 轴
  • dotsize=1:点的大小
  • stackdir='center': 堆叠点的方式:四个值:
    • “向上”(默认),
    • “下”
    • “中央”
    • “中心整体”

输出:

Box 用点绘制

控制美学 Box 情节

更改框的颜色

您可以更改组的颜色。

ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) +
    geom_boxplot() +
    theme_classic()

Code 说明

  • 组的颜色由 aes() 映射控制ping您可以使用 color=Month 来根据月份更改箱线图的颜色。

输出:

改变颜色 Box

Box 包含多个组的绘图

也可以添加多个组。您可以根据测量日期直观地了解空气质量的差异。

ggplot(data_air_nona, aes(Month, Ozone)) +
    geom_boxplot(aes(fill = day_cat)) +
    theme_classic()

Code 说明

  • aes() 映射ping 几何对象控制要显示的组(此变量必须为因子)
  • aes(fill= day_cat) 允许在 x 轴上为每个月创建三个框

输出:

Box 绘制多个组

Box 抖动点绘图

另一种展示单个观测值的方法是使用抖动点。当分类 x 轴导致许多点落在同一位置时,抖动是常用的选择。

这种方法避免了重叠。ping 离散数据。

box_plot +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(width = 0.21)) +
    theme_classic()

Code 说明

  • geom_jitter() 函数会给每个点添加一个小的随机位移,从而实现重叠。ping 数值变得可见。
  • shape=15 改变点的形状。15 代表正方形
  • color = “steelblue”:改变点的颜色
  • position = position_jitter(width = 0.21): 控制点在 x 轴方向上的横向位移量,单位为 0.21。默认值为类别间距的 40%。

输出:

Box 抖动点绘图

您可以看到第一张采用抖动法绘制的图表与第二张采用点法绘制的图表之间的区别。

box_plot +
    geom_boxplot() +
    geom_point(shape = 5,
        color = "steelblue") +
    theme_classic()

Box 抖动点绘图

缺口 Box 情节

geom_boxplot() 的一个有趣特性是 R 中的带缺口箱线图函数。带缺口图会将箱线缩小到中位数附近。带缺口箱线图的主要目的是比较各组之间中位数的显著性。有充分证据表明,当缺口不重叠时,两组的中位数不同。缺口计算如下:

缺口 Box 情节

这里,IQR是四分位距,n是该组中的观测值数量。缺口大致跨越了中位数的95%置信区间。

box_plot +
    geom_boxplot(notch = TRUE) +
    theme_classic()

Code 说明

  • geom_boxplot(notch = TRUE): 绘制中位数周围带有缺口的箱线图

输出:

缺口 Box 情节

如何向文档添加标题、标签和自定义颜色 Box 在 R 中绘制图形

以上图表使用了 ggplot2 的默认设置,直接采用数据框中的变量名。一个可以发布的图表需要清晰易读的标签和精心设计的配色方案。

标题和坐标轴标签。 一次 labs() 调用即可设置所有文本元素:

box_plot +
    geom_boxplot(fill = "coral", alpha = 0.7) +
    labs(title = "Ozone concentration by month",
        subtitle = "New York, May to September 1973",
        x = "Month",
        y = "Ozone (parts per billion)",
        caption = "Source: airquality dataset") +
    theme_classic()

选择你喜欢的颜色。 当填充映射在 aes() 函数内部时,使用 scale_fill_manual() 函数;当颜色映射在 aes() 函数内部时,使用 scale_colour_manual() 函数。

ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) +
    geom_boxplot() +
    scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) +
    theme_classic() +
    theme(legend.position = "none")

这里关闭了图例,因为 x 轴已经标明了每个月份的名称,重复显示会浪费空间。

重新排列盒子。 因子水平决定了坐标轴上的顺序。由于“月份”因子是按有序变量创建的,因此它已经按时间顺序排列。对于无序因子,则应按中位数排序:

ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) +
    geom_boxplot() +
    theme_classic()

正在保存图表。 ggsave() 函数会将最后一个绘图以您控制的分辨率写入磁盘:

ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)

Box R语言绘图: Code 参考法案

下表列出了上述每种箱线图变体的 ggplot2 调用:

目的 Code
基本箱线图
ggplot(df, aes(x = x1, y = y)) + geom_boxplot()
翻转方向
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip()
缺口箱线图
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE)
Box 带有抖动点的绘图
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21))
按组着色
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot()
每个类别有多个组
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2))
加上组均值
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point")

还检查: - R 初学者教程:学习 R 编程语言

常见问题

须线延伸至距离最近四分位数1.5倍四分位距范围内的最极端观测值。它们并非最小值和最大值,超出这些范围的任何值都被视为离群点。

并非如此。1.5倍四分位距规则只是一种约定俗成的做法,并非误差的证明。应先逐点分析:例如臭氧读数等偏态数据自然会产生较高的数值,而这些高数值本身就是真实的测量结果。

交叠ping 缺口表明没有强有力的证据表明两个中位数存在差异。无重叠ping 刻度线表示可能存在实际差异,大致相当于 95% 的置信度比较。

Box 绘制分布图是训练前的标准探索步骤:它们可以揭示数据偏斜、异常值以及不同类别间特征尺度的差异。研究团队还会利用分布图来比较交叉验证各折叠模型的准确率。

是的。人工智能助手可以解释诸如连续的 x 轴生成单个方框之类的错误,并建议正确的 aes() 映射。ping并标记已弃用的参数,例如 fun.y。务必使用您自己的数据重新运行更正后的代码。

总结一下这篇文章: