如何在R语言循环中批量保存uORF与mORF相关性散点图
批量绘制转录本uORF与mORF reads相关性散点图的修正方案
先明确数据前提:假设你的uORF_df和mORF_df是行对应44个组织,列对应90K个转录本ID,单元格存储对应组织中该转录本的uORF/mORF reads数。原始代码的问题大概率出在转置后的数据对齐、文件名非法字符处理,以及循环效率上,以下是修正后的完整实现:
1. 数据转置与规整
转置后必须保证uORF和mORF的转录本、组织完全匹配,用长格式整理更方便后续绘图:
# 转置并转为数据框,保留转录本ID作为行名衍生列 uORF_t <- as.data.frame(t(uORF_df)) uORF_t$transcript_id <- rownames(uORF_t) mORF_t <- as.data.frame(t(mORF_df)) mORF_t$transcript_id <- rownames(mORF_t) # 加载tidyverse工具包整理数据(未安装先运行install.packages("tidyverse")) library(tidyverse) # 转成长格式并合并,确保每个转录本的组织数据一一对应 uORF_long <- pivot_longer(uORF_t, -transcript_id, names_to = "tissue", values_to = "uORF_reads") mORF_long <- pivot_longer(mORF_t, -transcript_id, names_to = "tissue", values_to = "mORF_reads") plot_data <- inner_join(uORF_long, mORF_long, by = c("transcript_id", "tissue"))
2. 批量绘图与保存
重点解决文件名拼接的错误(比如转录本ID含特殊字符导致保存失败),同时优化内存占用:
# 创建专门目录存储图片,避免工作目录混乱 dir.create("uORF_mORF_corr_plots", showWarnings = FALSE) # 获取所有唯一的转录本ID all_transcripts <- unique(plot_data$transcript_id) # 循环处理每个转录本 for (tid in all_transcripts) { # 提取当前转录本的所有组织数据 curr_data <- filter(plot_data, transcript_id == tid) # 计算皮尔逊相关系数(可选,添加到图副标题) corr_val <- round(cor(curr_data$uORF_reads, curr_data$mORF_reads, use = "complete.obs"), 2) # 用ggplot2绘图(美观度更高) p <- ggplot(curr_data, aes(x = uORF_reads, y = mORF_reads)) + geom_point(alpha = 0.6, size = 1.2) + labs(title = tid, # 直接用转录本ID作为图标题 x = "uORF Reads", y = "mORF Reads", subtitle = paste0("Pearson r = ", corr_val)) + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) # 标题居中 # 处理转录本ID中的非法字符(如/、空格、@),替换为下划线避免保存失败 safe_tid <- gsub("[^a-zA-Z0-9_.-]", "_", tid) # 保存图片到指定目录 ggsave(file.path("uORF_mORF_corr_plots", paste0("corr_", safe_tid, ".png")), plot = p, width = 6, height = 6, dpi = 100) # 清理当前循环变量,释放内存(90K个图必须执行,避免内存溢出) rm(p, curr_data) gc() }
3. 常见问题修正与提速方案
- 文件名错误:原始代码未处理转录本ID中的特殊字符,导致系统无法识别文件名,用
gsub替换所有非法字符为下划线即可解决 - 数据错位:转置后未对齐转录本和组织会导致绘图数据混乱,
inner_join能保证只有同时存在于uORF和mORF的数据才会被保留 - 内存溢出:90K个ggplot对象会占用大量内存,每次循环后删除变量并调用
gc()强制垃圾回收,避免程序崩溃 - 提速方案:如果觉得ggplot2速度慢,可改用base绘图,示例代码如下:
for (tid in all_transcripts) { curr_data <- filter(plot_data, transcript_id == tid) corr_val <- round(cor(curr_data$uORF_reads, curr_data$mORF_reads, use = "complete.obs"), 2) safe_tid <- gsub("[^a-zA-Z0-9_.-]", "_", tid) # 打开png绘图设备 png(file.path("uORF_mORF_corr_plots", paste0("corr_", safe_tid, ".png")), width = 600, height = 600, res = 100) # base绘图 plot(curr_data$uORF_reads, curr_data$mORF_reads, main = tid, xlab = "uORF Reads", ylab = "mORF Reads", pch = 16, col = rgb(0,0,1,0.6)) mtext(paste0("Pearson r = ", corr_val), side = 3, line = 0.5) # 可选:添加线性拟合线 abline(lm(mORF_reads ~ uORF_reads, data = curr_data), col = "red", lwd = 1) # 关闭绘图设备 dev.off() rm(curr_data) gc() }
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

