You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:31:19