如何循环遍历DESeq2对象vsd的变量列,批量生成不同分组颜色的bulk RNA-seq数据PCA图?
批量生成按不同变量分组的Bulk RNA-seq PCA图(基于DESeq2的vsd对象)
我最近在处理bulk RNA-seq数据,想用DESeq2的vsd对象批量生成PCA图——要求每个图都用vsd里的不同变量作为颜色分组依据。目前我只能手动写代码生成单个图,代码如下:
pcaData <- plotPCA(vsd, intgroup=c("Age", "BlastRate"), returnData=TRUE) percentVar <- round(100 * attr(pcaData, "percentVar")) ggplot(pcaData, aes(PC1, PC2, color=Age, shape=BlastRate)) + geom_point(size=3) + xlab(paste0("PC1: ",percentVar[1],"% variance")) + ylab(paste0("PC2: ",percentVar[2],"% variance")) + geom_text(aes(label=name),hjust=-.2, vjust=0) + ggtitle("Principal Component Analysis")
现在我想找一种循环遍历的方法,把代码里的Age替换成vsd的其他变量列,批量生成对应的PCA图。我的vsd对象的列数据信息如下:
> head(colData(vsd),1) DataFrame with 1 row and 14 columns LibSize LibDiversity PercMapped Age SpermStatus SpConc SpMot Subject.Group PairedSample FertRate <factor> <factor> <factor> <factor> <character> <factor> <factor> <factor> <factor> <factor> sRNA_1 Low High High 42-46 unk unk unk Male-Male 2 Low BlastRate RNABatch LibPrepBatch sizeFactor <factor> <factor> <factor> <numeric> sRNA_1 Low 1 6 0.929408
解决方案:循环遍历变量批量生成PCA图
这里提供一个高效的循环方法,同时处理变量过滤、动态绘图和可选的图片保存:
# 1. 提取colData中的变量名,过滤掉数值型列(比如sizeFactor,连续值不适合做分组颜色) group_vars <- colnames(colData(vsd))[sapply(colData(vsd), function(x) !is.numeric(x))] # 2. 循环遍历每个变量生成PCA图 for (var in group_vars) { # 生成PCA数据 pcaData <- plotPCA(vsd, intgroup = c(var, "BlastRate"), returnData = TRUE) percentVar <- round(100 * attr(pcaData, "percentVar")) # 绘制PCA图,用.data[[var]]解决ggplot的动态变量引用问题 p <- ggplot(pcaData, aes(PC1, PC2, color = .data[[var]], shape = BlastRate)) + geom_point(size = 3) + xlab(paste0("PC1: ", percentVar[1], "% variance")) + ylab(paste0("PC2: ", percentVar[2], "% variance")) + geom_text(aes(label = name), hjust = -.2, vjust = 0) + ggtitle(paste0("Principal Component Analysis - Colored by ", var)) + theme_minimal() # 可选:优化图表主题 # 打印当前图 print(p) # 可选:将每个图保存为独立文件,文件名包含变量名 ggsave( filename = paste0("PCA_", var, ".png"), plot = p, width = 8, height = 6, dpi = 300 ) }
代码说明
- 变量过滤:用
sapply筛选掉数值型列(比如sizeFactor),避免用连续值做颜色分组(如果需要保留数值型变量,直接去掉过滤步骤,用group_vars <- colnames(colData(vsd))即可) - 动态变量引用:使用
.data[[var]]来在ggplot中动态调用循环变量,避免ggplot的非标准求值导致的错误 - 个性化区分:每个图的标题会标注当前分组变量,保存的文件名也包含变量名,方便后续查看
- 可选保存:
ggsave会自动把每个图保存为PNG文件,你可以根据需要调整尺寸、格式(比如PDF)和分辨率
内容的提问来源于stack exchange,提问作者Stewart Russell
相关产品推荐
相关产品推荐

