被问了很多次的富集分析绘图教程,0基础也能1分钟完成

上一期我们利用“相关性分析与‘星号’标记热图绘制”这一具体场景,对比评测了 Claude 与 DeepSeek 的表现差异(#上期链接)。这一节,我们聚焦 KEGG、GO 富集分析这一场景,对比 GPT 和 deepseek 的表现。 在本次针对拟南芥 KEGG 与 GO 富集分析及 aPEAR 包网络图绘制的特定任务中,DeepSeek 在理解和应用新工具细节上需要更多的人工干预和代码修改。GPT 对该问题的理解、特定 R 包细节的适应性以及错误修正能力具有明显优势。

期望结果图

图1 期望结果图

图1 期望结果图

数据准备

富集分析的数据准备很简单,只需整理单列的目的基因列表即可,如下图,基因 ID 的类型可以是 NCBI Gene ID、Gene Symbol、Ensembl ID 等。本次使用的数据是拟南芥的基因。

图2 拟南芥基因

图2 拟南芥基因

生成 KEGG 、GO 富集分析及 aPEAR 包网络图代码

分别打开 GPT、Deepseek 上传范例数据。GPT 点击“+”上传文件,Deepseek 点击“回形针”上传文件。

输入指令:

附件文件为目的基因文件,研究物种为拟南芥,使用 clusterProfiler 对附件文件进行 GO、KEGG 富集分析,将分析结果以 csv 表格导出,并使用 KEGG 富集分析结果进行条形图和气泡图的绘制,使用 aPEAR 包对 GO、KEGG 分析结果分别进行富集网络图绘制,给出 R 代码。

值得注意的是:GPT 和 Deepseek 都注意到拟南芥基因 ID 的特殊性,基因 ID 带有版本号。KEGG、GO 富集分析需要去掉版本号。二者对于 KEGG 富集分析处理方式有所不同:

ChatGPT:

代码语言:javascript代码运行次数:0运行复制
# 4. KEGG富集分析
# 注意:KEGG拟南芥是用物种代号"ath"
ekegg <- enrichKEGG(gene         = genes,
                    organism     = 'ath',
                    keyType      = "kegg",
                    pvalueCutoff = 0.05,
                    qvalueCutoff = 0.05)

Deepseek:

代码语言:javascript代码运行次数:0运行复制
# KEGG富集分析(需转换ID)
gene_entrez <- bitr(genes, fromType = "TAIR", toType = "ENTREZID", OrgDb = org.At.tair.db)
kegg_enrich <- enrichKEGG(
  gene         = gene_entrez$ENTREZID,
  organism     = "ath",  # 拟南芥的KEGG代码
  pvalueCutoff = 0.05,
  qvalueCutoff = 0.2
)

Deepseek 给出的代码报错:

代码语言:javascript代码运行次数:0运行复制
gene_entrez <- bitr(genes, fromType = "TAIR", toType = "ENTREZID", OrgDb = org.At.tair.db)
'select()' returned 1:1 mapping between keys and columns
Warning message:
In bitr(genes, fromType = "TAIR", toType = "ENTREZID", OrgDb = org.At.tair.db) :
  3.61% of input gene IDs are fail to map...
kegg_enrich <- enrichKEGG(
   gene         = gene_entrez$ENTREZID,
   organism     = "ath",  # 拟南芥的KEGG代码
   pvalueCutoff = 0.05,
   qvalueCutoff = 0.2
 )
--> No gene can be mapped....
--> Expected input gene ID: AT4G37840,AT5G36880,AT5G55590,AT1G56190,AT4G29220,AT5G03290
--> return NULL...
head(genes)
[1] "AT1G01090""AT1G01220""AT1G01220""AT1G01220""AT1G01220""AT1G01220"
head(gene_entrez)
       TAIR ENTREZID
1 AT1G01090   839429
2 AT1G01220   839420
3 AT1G02310   839444
4 AT1G02790   839391
5 AT1G02810   838078
7 AT1G04410   839527

向Deepseek输入优化报错代码指令:

根据与Deepseek对话的内容,尝试了不同的方法处理基因ID,包括去除版本号和添加KEGG物种前缀。经过我们的提示,Deepseek最终发现直接使用纯TAIR ID(去除版本号)可以有效解决问题。

将二者生成的代码复制到RStudio工作空间,分步运行。得出KEGG和GO富集分析的表格。

以GO富集分析为例,GO富集分析的结果表格会自动保存在工作目录中,打开CSV格式的分析结果表格如下图。

GPT和DeepSeek按要求给出了TOP20显著富集的KEGG富集分析结果条形图和气泡图的绘制方法,效果如下图。

接下来在使用aPEAR包对GO、KEGG分析结果分别进行富集网络图的绘制方法绘制网络图时,二者生成的代码都有错误信息,报错信息不同,处理方式而不同。由于我们安装的是最新版本aPEAR包,我们提示了enrichmentNetwork()函数的用法。GPT能够精准修正,最终得到理想结果图。但是Deepseek对enrichmentNetwork()内置参数的理解有所偏差,经过几次调整没有解决问题。为了节省时间成本,我们自行修改了代码。

以GO富集分析的结果绘制网络图为例。绘制效果图如下:

参考绘图代码:ChatGPT

代码语言:javascript代码运行次数:0运行复制
setwd("/mnt/data/home/work/Rich")
# 加载包
library(clusterProfiler)
library(org.At.tair.db)
library(KEGGREST)
library(aPEAR)
library(enrichplot)
library(ggplot2)

# 读入基因列表
gene_list <- read.table("genes.txt", header = FALSE, stringsAsFactors = FALSE)
genes <- unique(gsub("\\..*", "", gene_list$V1)) # 去除版本号(如.1、.2)

# GO 富集分析
ego <- enrichGO(
  gene          = genes,
  OrgDb         = org.At.tair.db,
  keyType       = "TAIR",
  ont           = "ALL",
  pAdjustMethod = "BH",
  pvalueCutoff  = 0.05,
  qvalueCutoff  = 0.05
)

# KEGG 富集分析
ekegg <- enrichKEGG(
  gene         = genes,
  organism     = 'ath',
  keyType      = "kegg",
  pAdjustMethod= "BH",
  pvalueCutoff = 0.05,
  qvalueCutoff = 0.05
)

# 保存结果为CSV
write.csv(as.data.frame(ego), file = "GO_enrichment_results.csv", row.names = FALSE)
write.csv(as.data.frame(ekegg), file = "KEGG_enrichment_results.csv", row.names = FALSE)

# --- KEGG富集分析绘图 ---

# 条形图
barplot(ekegg, showCategory = 20, title = "KEGG Pathway Enrichment (Top 20)")

# 气泡图
dotplot(ekegg, showCategory = 20, title = "KEGG Pathway Dotplot (Top 20)")

# --- 使用aPEAR绘制富集网络图 ---

# GO网络图
ego_df <- as.data.frame(ego)
ekegg_df <- as.data.frame(ekegg)

# 用 aPEAR 绘制GO网络图
GO_network <- aPEAR::enrichmentNetwork(
  enrichment = ego_df,
  simMethod = "jaccard",      # 相似性方法
  clustMethod = "markov",    # 修改为markov、hier或spectral之一
  clustNameMethod = "pagerank"   # 用pagerank作为节点标签
)
plot(GO_network)


# KEGG网络图
KEGG_network <- aPEAR::enrichmentNetwork(
  enrichment = ekegg_df,
  simMethod = "jaccard",
  clustMethod = "markov",    # 修改为markov、hier或spectral之一
  clustNameMethod = "pagerank"   # 用pagerank作为节点标签
)
plot(KEGG_network)

Deepseek

代码语言:javascript代码运行次数:0运行复制
setwd("/mnt/data/home/work/Rich")
library(clusterProfiler)
library(org.At.tair.db)
library(enrichplot)
library(ggplot2)
library(aPEAR)
library(httr)

# --------------------------
# 步骤1:读取基因列表并预处理
# --------------------------
# 读取基因列表(保留原始ID)
gene_list <- readLines("genes.txt")  # 确保文件路径正确
genes <- sub("\\.\\d+$", "", gene_list)

# 预处理GO ID格式(保留原始TAIR ID)
#genes_go <- gene_list  # 直接使用原始TAIR ID(含版本号)
#都要去除版本号
# --------------------------
# 步骤2:GO富集分析
# --------------------------
ego <- enrichGO(
  gene          = genes,
  OrgDb         = org.At.tair.db,
  keyType       = "TAIR",        # 指定输入为TAIR ID
  ont           = "ALL",         # 分析所有本体(BP/MF/CC)
  pAdjustMethod = "BH",
  pvalueCutoff  = 0.05,
  qvalueCutoff  = 0.05
)

# 导出GO结果
write.csv(as.data.frame(ego), "GO_enrichment_results.csv", row.names = FALSE)

# --------------------------
genes_kegg <- sub("\\.\\d+$", "", gene_list)  # 仅去除版本号,保留TAIR ID(如AT1G01090)

# 执行KEGG富集分析(关键修正:直接使用TAIR ID)
ekegg <- enrichKEGG(
  gene          = genes,    # 输入格式为AT1G01090
  organism      = "ath",         # 指定物种为拟南芥
  keyType       = "kegg",        # 指定KEGG数据库
  pAdjustMethod = "BH",
  pvalueCutoff  = 0.05,
  qvalueCutoff  = 0.05
)

write.csv(as.data.frame(ekegg), "KEGG_enrichment_results.csv", row.names = FALSE)


# --------------------------
# 步骤4:可视化
# --------------------------
# KEGG条形图
barplot(ekegg, showCategory = 20) + 
  ggtitle("KEGG Pathway Enrichment") +
  theme(axis.text.y = element_text(size = 10))

#ggsave("KEGG_barplot.png", p1, width = 10, height = 8)

# KEGG气泡图
dotplot(ekegg, showCategory = 20) + 
  ggtitle("KEGG Pathway Enrichment") +
  theme(axis.text.y = element_text(size = 10))
#p2
#ggsave("KEGG_dotplot.png", p2, width = 10, height = 8)

ego_df <- as.data.frame(ego)
ekegg_df <- as.data.frame(ekegg)

GO_network <- aPEAR::enrichmentNetwork(
  enrichment = ego_df,
  simMethod = "jaccard",      # 相似性方法
  clustMethod = "markov",    # 修改为markov、hier或spectral之一
  clustNameMethod = "pagerank"   # 用pagerank作为节点标签
)
plot(GO_network)


# KEGG网络图
KEGG_network <- aPEAR::enrichmentNetwork(
  enrichment = ekegg_df,
  simMethod = "jaccard",
  clustMethod = "markov",    # 修改为markov、hier或spectral之一
  clustNameMethod = "pagerank"   # 用pagerank作为节点标签
)
plot(KEGG_network)

结果核查: 我们仔细检查生成的图,确认颜色、数值(如图显示)、星号标记都符合预期,并且与我们的统计学理解一致。

在本次针对拟南芥 KEGG 与 GO 富集分析及可视化的评测中,GPT 和 DeepSeek 都展现了相当的代码生成能力,并能识别出关键的基因 ID 处理问题。然而,两者在解决具体问题和适应特定 R 包的细节上表现各异。GPT 在直接处理 KEGG 富集分析的基因 ID 类型以及后续根据提示修正 aPEAR 包网络图代码方面显得更为精准和高效。 相比之下,DeepSeek 虽然也能完成核心的富集分析和常规绘图,但在 KEGG ID 转换上采取了稍显曲折的路径并遇到报错,且在理解和应用 aPEAR 包新函数的参数时暴露出一定的偏差,需要用户更多的介入和修正。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-30,如有侵权请联系 cloudcommunity@tencent 删除基础教程数据go表格