箱线分面图(Boxplot Faceting)用于展示一个或多个分组变量的统计分布。通过将箱线图按照某个分类变量的不同类别进行分组排列,可以方便地比较不同分组中数据的分布情况。这种图表结合了箱线图和分面(Faceting)的概念,使得数据的多维对比更为直观和有效。
箱线图(Boxplot)组成部分:
- 中位数:数据集中的中位数,箱线图中的一条线表示。
- 四分位数:数据集被分为四等份,第一四分位数(Q1)和第三四分位数(Q3)形成箱体的底部和顶部。
- 箱体(IQR,四分位距):表示数据的中间50%,即Q1到Q3的距离。
- 须(Whisker):从箱体向外延伸,通常延伸至最小值和最大值或1.5倍的四分位距外的异常值边界。
- 异常值:通常用小点表示,这些是超出须端的数据点。
分面(Faceting):
- 分面是一种将数据集拆分成多个小图(分面),按照一个或多个分类变量进行组织的技术。
- 每个分面都是一个箱线图,展示该分类下的数据分布。
- 分面可以是垂直或水平的,也可以是网格形式的,这取决于要展示的分类变量的数量和类型。
示例
# 加载所需库
library(ggplot2)
library(dplyr)
library(tidyr)
library(readr) # 更现代的读取数据函数
# 文件路径
inputFile <- "input.txt"
outFile <- "boxplot.pdf"
# 读取输入文件
rt <- read_tsv(inputFile, col_names = TRUE, col_types = cols(.default = col_double()), .name_repair = "minimal")
names(rt)[1] <- "Type"
x <- names(rt)[1]
# 差异分析
# 重新组织数据以便使用dplyr和purrr进行统计测试
rt_long <- pivot_longer(rt, -Type, names_to = "Gene", values_to = "Expression")
# 进行统计测试
rt_long <- rt_long %>%
group_by(Gene, Type) %>%
nest() %>%
mutate(test_result = map(data, ~ {
if (n_distinct(.x$Type) > 2) {
kruskal.test(Expression ~ Type, data = .x)
} else {
wilcox.test(Expression ~ Type, data = .x)
}
})) %>%
mutate(p_value = map_dbl(test_result, ~ .x$p.value),
Sig = case_when(
p_value < 0.001 ~ "***",
p_value < 0.01 ~ "**",
p_value < 0.05 ~ "*",
TRUE ~ ""
)) %>%
ungroup() %>%
mutate(Gene = paste(Gene, Sig))
# 绘制
p1 <- ggplot(rt_long, aes(x = Type, y = Expression, fill = Type)) +
geom_boxplot() +
facet_wrap(~Gene, nrow = 1) +
labs(x = x, y = "Gene expression") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# 输出
ggsave(outFile, plot = p1, width = 9, height = 5)
ggplot2
: 用于创建高级图形。dplyr
: 提供了一组工具,用于高效数据操纵和分析。tidyr
: 用于数据整理,将数据从宽格式转换为长格式。readr
: 提供了更快更友好的数据读取函数。inputFile
: 指定输入文件的路径,此处为"text.txt"。outFile
: 指定输出文件的路径,此处为"boxplot.pdf"。使用
read_tsv
从readr
包读取制表符分隔的数据文件。col_names = TRUE
表示第一行数据为列名,col_types
设置所有列默认为双精度类型,name_repair = "minimal"
用于处理列名,保持原始列名不变。将数据框的第一列重新命名为"Type",这是后续分析中用作分类变量的列。
使用
pivot_longer
函数将数据从宽格式转换为长格式,方便进行分组和统计测试。在长格式数据中,每个基因的表达水平现在在"Expression"列,基因名在"Gene"列,样本类型在"Type"列。
group_by(Gene, Type)
: 按基因和类型分组。nest()
: 将每个组的数据嵌套在一个列表列中,便于应用统计测试。mutate(test_result = map(data, ~ {...}))
: 使用map
函数应用统计测试。如果类型大于两个,使用Kruskal-Wallis检验;否则,使用Wilcoxon检验。计算p值,并根据p值添加显著性标记(***, **, *, 空)。
ungroup()
: 移除分组状态。mutate(Gene = paste(Gene, Sig))
: 在基因名后添加显著性标记。使用
ggplot2
生成箱线图,按"Type"分类,以"Expression"为y值。facet_wrap(~Gene, nrow = 1)
: 使用facet_wrap
分面显示每个基因,每行显示一个分面。theme_bw()
: 使用黑白主题。theme(axis.text.x = element_text(angle = 45, hjust = 1))
: 调整x轴标签的角度和位置,以提高可读性。ggsave
: 保存图形为PDF文件,指定文件路径和尺寸。
这段代码整体非常结构化和系统化,适合进行大规模的数据分析和可视化,特别是在生物信息学或医学研究中分析基因表达数据。