Trp_Cys 2026-01-26 22:56 采纳率: 58.6%
浏览 4

富集分析可视化代码报错

之前写的富集分析可视化代码,之前是可以正常运行的,为什么这次运行绘制气泡图的代码时会失败?

# ====================== 6. 模块3:GO富集分析(原逻辑无修改) ======================
write_log("========== 开始:GO富集分析(生物过程BP+细胞组分CC+分子功能MF) ==========")
write_log(paste("富集分析筛选阈值:p<", threshold$adj_pval, ",q<", threshold$adj_pval))
check_files(c("diff.txt")) # 检查差异基因文件是否存在
# 6.1 读取差异基因并转换为Entrez ID(clusterProfiler要求)
rt <- read.table("diff.txt", header = T, sep = "\t", check.names = F)
genes <- as.vector(rt[,1])
write_log(paste("输入GO富集分析的差异基因数:", length(genes)))
# 基因名→Entrez ID转换
entrezIDs <- as.character(mget(genes, org.Hs.egSYMBOL2EG, ifnotfound = NA))
gene <- entrezIDs[entrezIDs != "NA"]
na_gene <- sum(is.na(entrezIDs))
write_log(paste("基因名→Entrez ID转换:有效ID数", length(gene), ",无效/未注释ID数", na_gene))
if(length(gene)==0){
  write_log("错误:无有效Entrez ID,GO富集分析终止!")
  stop("无有效Entrez ID,无法进行GO富集分析")
}

# 6.2 GO富集分析(全本体:BP+CC+MF)
kk <- enrichGO(gene = gene, OrgDb = org.Hs.eg.db, pvalueCutoff = 1, qvalueCutoff = 1, 
               ont = "all", readable = T) # 先不筛选,后续统一过滤
GO <- as.data.frame(kk)
# 筛选显著富集的GO条目
GO_sig <- GO[(GO$pvalue<threshold$adj_pval & GO$qvalue<threshold$adj_pval),]
write.table(GO_sig, file = "GO.txt", sep = "\t", quote = F, row.names  =  F)
write_log(paste("GO富集分析总条目数:", nrow(GO), ",显著富集条目数:", nrow(GO_sig)))
if(nrow(GO_sig)==0){
  write_log(paste("警告:无显著富集的GO条目(p<", threshold$adj_pval, ", q<", threshold$adj_pval, "),跳过GO可视化"))
}else{
  write_log(paste("输出GO显著富集结果:GO.txt(含本体、描述、基因数、p值、q值、核心基因)"))
  # 6.3 定义展示条目数(不足5个则展示全部)
  showNum <- if(nrow(GO_sig)<5) nrow(GO_sig) else 5
  colorSel <- if(threshold$adj_pval>0.05) "pvalue" else "qvalue" # 颜色依据:q值优先
  # 6.4 绘制GO可视化图:柱状图+气泡图(分本体展示)
  # 柱状图(展示富集因子)
  pdf(file = "GObarplot.pdf", width = 12, height = 12)
  print(barplot(kk, drop = TRUE, showCategory = showNum, split = "ONTOLOGY", color = colorSel) + 
          facet_grid(ONTOLOGY~., scale = 'free'))
  dev.off()
  
  # 气泡图(展示基因数+富集因子)
  pdf(file = "GObubble.pdf", width = 12, height = 12)
  bub = dotplot(kk, showCategory = showNum, orderBy = "GeneRatio", split = "ONTOLOGY", color = colorSel) + facet_grid(ONTOLOGY~., scale = 'free')
  print(bub)
  dev.off()
  
  # 6.5 绘制GO圈图+聚类图(展示基因与GO条目的关联)
  go <- data.frame(Category=GO_sig$ONTOLOGY, ID=GO_sig$ID, Term=GO_sig$Description, 
                   Genes = gsub("/", ", ", GO_sig$geneID), adj_pval = GO_sig$p.adjust)
  genelist <- data.frame(ID=rt$id, logFC=rt$logFC); row.names(genelist)=genelist[,1]
  circ <- circle_dat(go, genelist)
  # 定义展示数(不足则展示全部)
  termNum <- if(nrow(go)<8) nrow(go) else 8
  geneNum <- if(nrow(genelist)<200) nrow(genelist) else 200
  chord <- chord_dat(circ, genelist[1:geneNum,], go$Term[1:termNum])
  # 圈图(基因-GO条目关联)
  pdf(file="GOcircos.pdf", width=10, height=10)
  GOChord(chord, space = 0.001, gene.order = 'logFC', gene.space = 0.25, 
          gene.size = 5, border.size = 0.1, process.label = 6)
  dev.off()
  # 聚类图(基因表达与GO条目聚类)
  pdf(file="GOcluster.pdf",width=12, height=10)
  GOCluster(circ, go$Term[1:termNum], lfc.space = 0.2, lfc.width = 1, 
            term.space = 0.2, term.width = 1)
  dev.off()
  write_log(paste("绘制GO富集圈图:GOcircos.pdf(展示前", termNum, "个GO条目与", geneNum, "个基因的关联)"))
  write_log(paste("绘制GO富集聚类图:GOcluster.pdf(展示基因logFC与GO条目的聚类关系)"))
}
write_log("========== 完成:GO富集分析 ==========\n")

img

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-26 22:57
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提供的代码在运行过程中出现 “绘制气泡图失败” 的问题,可能的原因包括以下几点。以下是详细的分析和解决方案:


    ✅ 一、可能的错误原因分析

    1. dotplot() 函数使用不当或依赖包未加载

      • dotplot() 是来自 enrichplot 包的函数,若未正确安装或加载该包,会导致错误。
      • 检查是否已加载 library(enrichplot)
    2. kk 对象格式不正确

      • enrichGO() 返回的是一个 enrichResult 类对象,不能直接用于 dotplot()
      • 应使用 as.data.frame(kk) 转换为数据框后再处理。
    3. showCategory 参数限制过小或无效

      • 如果 showNum 设置为 0 或者小于 0,会导致绘图失败。
    4. facet_grid() 使用不当

      • dotplot() 中使用 facet_grid() 可能导致图形渲染失败。
    5. 图形设备未正确关闭

      • dev.off() 未正确调用,可能导致图形文件未生成或部分错误。
    6. R 环境中某些依赖库版本不兼容

      • 特别是 clusterProfiler, enrichplot, ggplot2 等包的版本不一致也可能导致问题。

    ✅ 二、修改后的代码(重点部分加粗)

    # ====================== 6. 模块3:GO富集分析(原逻辑无修改) ======================
    write_log("========== 开始:GO富集分析(生物过程BP+细胞组分CC+分子功能MF) ==========")
    write_log(paste("富集分析筛选阈值:p<", threshold$adj_pval, ",q<", threshold$adj_pval))
    check_files(c("diff.txt")) # 检查差异基因文件是否存在
    
    # 6.1 读取差异基因并转换为Entrez ID(clusterProfiler要求)
    rt <- read.table("diff.txt", header = T, sep = "\t", check.names = F)
    genes <- as.vector(rt[,1])
    write_log(paste("输入GO富集分析的差异基因数:", length(genes)))
    
    # 基因名→Entrez ID转换
    entrezIDs <- as.character(mget(genes, org.Hs.egSYMBOL2EG, ifnotfound = NA))
    gene <- entrezIDs[entrezIDs != "NA"]
    na_gene <- sum(is.na(entrezIDs))
    write_log(paste("基因名→Entrez ID转换:有效ID数", length(gene), ",无效/未注释ID数", na_gene))
    
    if(length(gene)==0){
      write_log("错误:无有效Entrez ID,GO富集分析终止!")
      stop("无有效Entrez ID,无法进行GO富集分析")
    }
    
    # 6.2 GO富集分析(全本体:BP+CC+MF)
    # **注意:这里需要先加载 enrichplot 包**
    library(enrichplot)  # **关键步骤:确保此包已安装并加载**
    
    kk <- enrichGO(gene = gene, OrgDb = org.Hs.eg.db, pvalueCutoff = 1, qvalueCutoff = 1, 
                   ont = "all", readable = T) # 先不筛选,后续统一过滤
    
    GO <- as.data.frame(kk)
    # 筛选显著富集的GO条目
    GO_sig <- GO[(GO$pvalue < threshold$adj_pval & GO$qvalue < threshold$adj_pval),]
    write.table(GO_sig, file = "GO.txt", sep = "\t", quote = F, row.names  =  F)
    write_log(paste("GO富集分析总条目数:", nrow(GO), ",显著富集条目数:", nrow(GO_sig)))
    
    if(nrow(GO_sig)==0){
      write_log(paste("警告:无显著富集的GO条目(p<", threshold$adj_pval, ", q<", threshold$adj_pval, "),跳过GO可视化"))
    } else {
      write_log(paste("输出GO显著富集结果:GO.txt(含本体、描述、基因数、p值、q值、核心基因)"))
    
      # 6.3 定义展示条目数(不足5个则展示全部)
      showNum <- if(nrow(GO_sig)<5) nrow(GO_sig) else 5
      colorSel <- if(threshold$adj_pval > 0.05) "pvalue" else "qvalue" # 颜色依据:q值优先
    
      # 6.4 绘制GO可视化图:柱状图+气泡图(分本体展示)
      # 柱状图(展示富集因子)
      pdf(file = "GObarplot.pdf", width = 12, height = 12)
      print(barplot(kk, drop = TRUE, showCategory = showNum, split = "ONTOLOGY", color = colorSel) + 
              facet_grid(ONTOLOGY~., scale = 'free'))
      dev.off()
    
      # 气泡图(展示基因数+富集因子)
      pdf(file = "GObubble.pdf", width = 12, height = 12)
      # **修正:使用 dotplot() 并传递正确的数据结构**
      bub = dotplot(kk, showCategory = showNum, orderBy = "GeneRatio", split = "ONTOLOGY", color = colorSel)
      print(bub)
      dev.off()
    }
    

    ✅ 三、解决方案总结(有序列表)

    1. 确保所有依赖包已安装并加载

      • 安装并加载 clusterProfilerenrichplot
        install.packages("clusterProfiler")
        install.packages("enrichplot")
        library(clusterProfiler)
        library(enrichplot)
        
    2. 检查 dotplot() 是否可用

      • 确保 kkenrichResult 类型对象,不是数据框。
    3. 避免使用 facet_grid()dotplot()

      • dotplot() 内部已经支持按本体分割,无需额外添加 facet_grid()
    4. 确保 showNum 不为 0 或负数

      • 添加校验逻辑:
        if (showNum <= 0) {
          showNum <- 5
        }
        
    5. 检查 R 运行环境与图形设备设置

      • 确保 pdf() 文件路径正确,且有写入权限。
      • 如果仍然失败,尝试使用 png()jpeg() 替代 pdf()

    ✅ 四、常见错误示例及修复建议

    | 错误信息 | 原因 | 修复方法 | |----------|------|----------| | object 'dotplot' not found | 未加载 enrichplot 包 | library(enrichplot) | | invalid 'x' argument | kkenrichResult 而非数据框 | as.data.frame(kk) | | no visible binding for global variable | kk 作用域问题 | 确保 kk 在当前环境中定义 |


    ✅ 五、推荐调试方式

    • 打印 kk 的结构
      str(kk)
      
    • 查看 GO_sig 是否为空
      if (nrow(GO_sig) == 0) {
        write_log("没有显著富集结果,跳过可视化")
        next
      }
      

    如果你能提供具体的报错信息(如错误提示或日志内容),我可以进一步定位问题。希望以上内容对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月26日