如何用par()与for循环批量绘制5个t-SNE图?
批量绘制5个t-SNE图的优化需求
我想避免重复编写5次代码,通过修改不同的vector,用par()和for循环同时绘制5个t-SNE图。以下是我尝试的批量代码和之前重复编写的代码,请帮忙实现批量绘图需求。
尝试的批量代码
mylst = list(totaldata$dataset,totaldata$Response,totaldata$CR,totaldata$RECIST, totaldata$Cancer_Type) for(i in 1:length(mylst)) { par(mfcol = c(3, 3)) tsne = Rtsne(t(scores.batch)) tsnetotal <- data.frame(x = tsne$Y[,1], y = tsne$Y[,2], col = as.factor(mylst[i])) ggplot(tsnetotal) + geom_point(aes(x=x, y=y, color = col), size = 3)+ theme_classic() + xlab("t-SNE 1") + ylab("t-SNE 2") + scale_colour_manual(breaks=colmapping$Var1, values=colmapping$mycolors) + title(main= paste("plot of ", mylst[i])) }
之前重复编写的代码
tsne = Rtsne(t(scores.batch)) tsnetotal <- data.frame(x = tsne$Y[,1], y = tsne$Y[,2], col = as.factor(totaldata$dataset)) ggplot(tsnetotal) + geom_point(aes(x=x, y=y, color = col), size = 3)+ theme_classic() + xlab("t-SNE 1") + ylab("t-SNE 2") + scale_colour_manual(breaks=colmapping$Var1, values=colmapping$mycolors) tsnetotal.2 <- data.frame(x = tsne$Y[,1], y = tsne$Y[,2], col = as.factor(totaldata$Response)) ggplot(tsnetotal.2) + geom_point(aes(x=x, y=y, color=col))+theme_classic() + xlab("t-SNE 1") + ylab("t-SNE 2") tsnetotal.3 <- data.frame(x = tsne$Y[,1], y = tsne$Y[,2], col = as.factor(totaldata$CR)) ggplot(tsnetotal.3) + geom_point(aes(x=x, y=y, color=col), size = 3)+theme_classic() + xlab('t-SNE 1')+ylab('t-SNE 2') + theme_gray() tsnetotal.4 <- data.frame(x = tsne$Y[,1], y = tsne$Y[,2], col = totaldata$RECIST) ggplot(tsnetotal.4) + geom_point(aes(x=x, y=y, color=col, size = 3))+theme_classic() + xlab('tSNE 1')+ylab('tSNE 2') tsne.5 = Rtsne(t(scores.batch)) tsnetotal.5 <- data.frame(x = tsne.5$Y[,1], y = tsne.5$Y[,2], col = as.factor(totaldata$Cancer_Type)) ggplot(tsnetotal.5) + geom_point(aes(x=x, y=y, color=col),size = 4)+theme_classic() + xlab('t-SNE 1')+ylab('t-SNE 2') + scale_colour_manual(breaks=colmappingMore$Var1, values=colmappingMore$mycolorsMore) + theme_gray()
优化后的批量绘图代码
原尝试代码存在几个问题:t-SNE重复计算浪费资源、par()对ggplot无效、未保留每个图的个性化参数。以下是修正后的代码:
# 提前一次性计算t-SNE结果,避免循环内重复运算 tsne_result <- Rtsne(t(scores.batch)) tsne_coords <- data.frame(x = tsne_result$Y[,1], y = tsne_result$Y[,2]) # 定义每个图的个性化参数:变量名、点大小、颜色映射、主题 plot_configs <- list( list(var = "dataset", size = 3, col_map = colmapping, theme = theme_classic()), list(var = "Response", size = 1, col_map = NULL, theme = theme_classic()), list(var = "CR", size = 3, col_map = NULL, theme = theme_gray()), list(var = "RECIST", size = 3, col_map = NULL, theme = theme_classic()), list(var = "Cancer_Type", size = 4, col_map = colmappingMore, theme = theme_gray()) ) # 循环生成所有图 plot_list <- list() for(i in seq_along(plot_configs)){ cfg <- plot_configs[[i]] # 拼接坐标与分组变量 plot_data <- cbind(tsne_coords, col = as.factor(totaldata[[cfg$var]])) # 构建基础ggplot对象 p <- ggplot(plot_data) + geom_point(aes(x = x, y = y, color = col), size = cfg$size) + xlab("t-SNE 1") + ylab("t-SNE 2") + ggtitle(paste("t-SNE Plot of", cfg$var)) + cfg$theme # 若有自定义颜色映射,添加对应设置 if(!is.null(cfg$col_map)){ p <- p + scale_colour_manual(breaks = cfg$col_map$Var1, values = cfg$col_map$mycolors) } plot_list[[i]] <- p } # 方式1:用patchwork包排版成网格(需先安装:install.packages("patchwork")) library(patchwork) wrap_plots(plot_list, ncol = 2) # 可调整ncol/nrow控制排版 # 方式2:逐个输出单图 for(p in plot_list){ print(p) }
代码说明
- 提前计算t-SNE结果,大幅提升运行效率
- 用配置列表统一管理每个图的个性化参数,避免重复代码
- 使用
patchwork替代par()实现多图排版,完美适配ggplot体系 - 完整保留了原重复代码中每个图的特殊设置(如Cancer_Type的专属颜色映射、部分图的theme_gray等)
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

