小提琴分面图(Violin plot)是一种用于展示和比较数据分布的可视化图形。它类似于箱线图,但提供了更多关于数据分布密度的信息。小提琴图的核心是小提琴形状,这种形状是通过核密度估计(KDE)来展示数据分布的密度。
小提琴图的组成:
- 中心标记:通常在小提琴的中心有一条线或一个点来标记数据的中位数。
- 箱线图:有时在小提琴内部会绘制一个简化的箱线图,表示四分位数和极值。
- 密度轮廓:小提琴的主体显示数据的密度,宽度表示在该值处的数据密度较高。
- 分面:分面是指将数据集分割成多个子集来单独展示每个子集的小提琴图,通常用于比较不同类别或组内的数据分布。
小提琴图的用途:
- 比较多个分组:小提琴图能够直观地比较不同分组或类别中的数据分布。
- 显示数据分布的对称性和偏态:通过观察小提琴的形状,可以容易地判断数据的对称性和是否存在偏态。
- 详细展示数据的多样性:与传统的箱线图相比,小提琴图提供了更多的信息,帮助理解数据在各个值上的密度。
示例
library(ggplot2)
library(reshape2)
inputFile <- "input.txt"
outFile <- "vioplot.pdf"
# 读取输入文件
rt <- read.table(inputFile, header=TRUE, sep="\t", check.names=FALSE, row.names=1)
colnames(rt)[1] <- "Type" # 只更改一次列名
# 差异分析
geneSig <- sapply(colnames(rt)[-1], function(gene) {
rt1 <- rt[, c(gene, "Type")]
test <- if (length(levels(factor(rt1$Type))) > 2) {
kruskal.test(expression ~ Type, data = rt1)
} else {
wilcox.test(expression ~ Type, data = rt1)
}
# 根据p值赋予标记
ifelse(test$p.value < 0.001, "***", ifelse(test$p.value < 0.01, "**", ifelse(test$p.value < 0.05, "*", "")))
})
colnames(rt)[-1] <- paste(colnames(rt)[-1], geneSig, sep="")
# 准备ggplot2绘图数据
data <- melt(rt, id.vars="Type")
colnames(data) <- c("Type", "Gene", "Expression")
# 绘制小提琴图
p1 <- ggplot(data, aes(x=Type, y=Expression, fill=Type)) +
geom_violin() +
geom_boxplot(width=0.2, position=position_dodge(0.9)) +
facet_wrap(~Gene, nrow=1) +
labs(x="Sample Type", y="Gene Expression", fill="Sample Type") +
theme_bw() +
theme(axis.text.x=element_text(angle=45, hjust=1))
# 输出图像
ggsave(filename=outFile, plot=p1, width=9, height=5, device="pdf")
载入库:
ggplot2
用于绘图,reshape2
用于数据重塑。读取数据:使用
read.table
从input.txt
读取数据,其中包含表头,字段间以制表符分隔。将第一列作为行名,且保留原有列名(除第一列外,该列被重命名为"Type")。-
差异分析:通过
sapply
函数对除“Type”列外的每一列(即每个基因)进行统计测试。根据“Type”分类,使用Kruskal-Wallis或Wilcoxon秩和检验来判断表达量差异的显著性。- 如果“Type”变量有超过两个水平,则使用Kruskal-Wallis检验。
- 如果只有两个水平,则使用Wilcoxon秩和检验。
显著性标记:根据p值添加显著性标记(***, **, *, "")。
更新列名:将显著性标记添加到相应基因的列名中。
重塑数据:使用
melt
函数将数据从宽格式转换为长格式,以便于ggplot2
绘图。在此过程中,保留“Type”作为分类变量,其他列(基因及其显著性标记)转换为变量名和值。-
构建图层:
-
geom_violin
:绘制小提琴图,显示数据分布。 -
geom_boxplot
:在小提琴图中间叠加一个窄宽度的箱线图,用于显示中位数和四分位数。
-
分面展示:
facet_wrap
按基因分面显示,每行显示一个基因。调整图形外观:设置主题(
theme_bw()
)和调整x轴文本角度(以便更好地显示长标签)。保存为PDF文件:
ggsave
函数直接保存绘制的图形为PDF格式,指定文件名、尺寸等。