news 2026/5/8 16:31:12

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

单细胞KEGG富集分析全流程:从基因ID转换到专业圈图可视化

在单细胞转录组数据分析中,功能富集分析是揭示差异基因生物学意义的关键步骤。许多研究者习惯性地只进行GO分析,却忽略了KEGG通路富集的重要性。实际上,KEGG分析能够提供基因在代谢通路和信号转导网络中的具体作用,与GO分析的泛功能注释形成互补。本文将详细介绍如何利用R语言和Perl脚本构建完整的KEGG富集分析流程,解决实际分析中的常见痛点,并生成高质量的圈图可视化结果。

1. KEGG与GO分析的互补价值

功能富集分析是单细胞研究从数据挖掘到生物学解释的桥梁。GO(Gene Ontology)和KEGG(Kyoto Encyclopedia of Genes and Genomes)作为两大主流数据库,分别从不同角度阐释基因功能:

  • GO分析:提供基因在细胞组分(cellular component)、分子功能(molecular function)和生物过程(biological process)三个层面的系统描述
  • KEGG分析:聚焦基因在代谢通路、信号转导和疾病相关通路中的具体角色

两者对比关键差异如下表所示:

特征GO分析KEGG分析
注释维度功能分类体系通路网络图
结果呈现层级结构通路图谱
适用场景广泛功能注释具体通路机制研究
可视化方式柱状图/气泡图通路图/圈图
基因关系体现功能相似性通路上下游关系

在实际项目中,我们推荐同时进行GO和KEGG分析以获得更全面的生物学洞见。特别是在研究疾病机制或药物靶点时,KEGG通路分析能够直观展示基因在特定病理生理过程中的相互作用网络。

2. 分析前的数据准备与环境配置

完整的KEGG富集分析流程需要准备以下输入文件和环境:

必需输入文件

  • id.txt:包含基因ID和对应logFC值的差异基因列表(通常来自Seurat等单细胞分析流程)
  • 文件格式要求:
    gene avg_logFC entrezID CD4 1.25 920 IL2 0.87 3558 ...

R环境配置

需要安装以下关键R包:

install.packages(c("clusterProfiler", "org.Hs.eg.db", "DOSE", "GOplot"))

Perl环境准备

Perl脚本主要用于基因ID转换,确保系统已安装Perl解释器(通常Linux/macOS已预装,Windows需单独安装Strawberry Perl等发行版)

注意:如果id.txt中缺少entrezID列,需要先使用bitr函数进行基因ID转换:

library(clusterProfiler) gene_df <- bitr(rt$gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")

3. KEGG富集分析核心步骤

3.1 执行KEGG富集分析

使用clusterProfiler包的enrichKEGG函数进行富集分析:

library(clusterProfiler) # 读取差异基因列表 rt <- read.table("id.txt", sep="\t", header=TRUE, check.names=FALSE) rt <- rt[!is.na(rt$entrezID), ] # 去除无entrezID的基因 # 执行KEGG富集 kk <- enrichKEGG( gene = rt$entrezID, organism = "hsa", # 人类使用hsa,小鼠用mmu pvalueCutoff = 0.05, qvalueCutoff = 0.05, use_internal_data = FALSE ) # 保存富集结果 write.table(kk, file="KEGGId.txt", sep="\t", quote=FALSE, row.names=FALSE)

3.2 基础可视化

生成标准的柱状图和气泡图:

# 柱状图 pdf("barplot.pdf", width=10, height=7) barplot(kk, drop=TRUE, showCategory=20, title="KEGG Pathway Enrichment", font.size=8) dev.off() # 气泡图 pdf("bubble.pdf", width=10, height=7) dotplot(kk, showCategory=20, title="KEGG Pathway Enrichment", font.size=8) dev.off()

4. 基因ID转换的Perl脚本解决方案

KEGG富集结果中的基因列表通常只包含Entrez ID,缺乏直观的基因符号。以下Perl脚本可将ID转换为基因名:

#!/usr/bin/perl use strict; use warnings; # 建立基因ID到符号的映射哈希 my %id2symbol = (); open(my $id_fh, "<", "id.txt") or die "无法打开id.txt: $!"; while(my $line = <$id_fh>) { chomp $line; my @fields = split(/\t/, $line); $id2symbol{$fields[2]} = $fields[0]; # entrezID => gene symbol } close($id_fh); # 处理KEGG结果文件 open(my $kegg_fh, "<", "KEGGId.txt") or die "无法打开KEGGId.txt: $!"; open(my $out_fh, ">", "kegg.txt") or die "无法创建kegg.txt: $!"; while(my $line = <$kegg_fh>) { chomp $line; if($. == 1) { # 保留标题行 print $out_fh "$line\n"; next; } my @cols = split(/\t/, $line); my @entrez_ids = split(/\//, $cols[-2]); # 分割基因ID列表 # 转换每个Entrez ID为基因符号 my @symbols = (); foreach my $id (@entrez_ids) { if(exists $id2symbol{$id}) { push @symbols, $id2symbol{$id}; } } $cols[-2] = join("/", @symbols); # 用基因符号替换原始ID print $out_fh join("\t", @cols) . "\n"; } close($kegg_fh); close($out_fh);

将上述代码保存为convert_ids.pl并运行:

perl convert_ids.pl

5. 高级可视化:GOplot圈图绘制

GOplot包提供了丰富的圈图可视化功能,能直观展示基因-通路关系:

library(GOplot) # 准备输入数据 ego <- read.table("kegg.txt", header=TRUE, sep="\t", check.names=FALSE) go_data <- data.frame( Category = "KEGG", ID = ego$ID, Term = ego$Description, Genes = gsub("/", ", ", ego$geneID), adj_pval = ego$p.adjust ) id_fc <- read.table("id.txt", header=TRUE, sep="\t", check.names=FALSE) genelist <- data.frame(ID = id_fc$gene, logFC = id_fc$avg_logFC) rownames(genelist) <- genelist[,1] # 生成圈图数据 circ <- circle_dat(go_data, genelist) # 设置可视化参数 term_num <- 5 # 展示top5通路 gene_num <- 50 # 展示top50基因 # 生成弦图 chord <- chord_dat(circ, genelist[1:gene_num,], go_data$Term[1:term_num]) pdf("circ.pdf", width=11, height=10) GOChord(chord, space=0.001, gene.order="logFC", gene.space=0.25, gene.size=5, border.size=0.1, process.label=8) dev.off() # 生成聚类图 term_colors <- c("#1F78B4", "#33A02C", "#E31A1C", "#FF7F00", "#6A3D9A") pdf("cluster.pdf", width=11, height=10) GOCluster(circ, go_data$Term[1:term_num], lfc.space=0.2, lfc.width=1, term.col=term_colors, term.space=0.2, term.width=1) dev.off()

6. 结果解读与优化技巧

6.1 圈图元素解读

  • 弦图(circ.pdf):展示基因与通路的关联关系

    • 内圈:基因,按logFC值排序
    • 外圈:KEGG通路
    • 连接线:表示基因在对应通路中富集
    • 颜色深浅:反映logFC值大小
  • 聚类图(cluster.pdf):展示基因表达模式与通路的关系

    • 左侧:基因表达变化(logFC)
    • 右侧:通路富集情况
    • 颜色:代表不同通路

6.2 常见问题解决

  1. 基因ID转换失败

    • 检查id.txt中entrezID列是否完整
    • 确保Perl脚本中的列索引正确
  2. 富集结果不显著

    • 调整pvalueCutoff和qvalueCutoff参数
    • 检查差异基因分析阈值是否合适
  3. 可视化效果不佳

    # 调整弦图参数示例 GOChord(chord, space=0.005, # 增加基因间距 gene.size=6, # 增大基因标签 process.label=10) # 增大通路标签

6.3 高级定制技巧

  • 通路筛选:在可视化前筛选特定通路

    # 只展示免疫相关通路 immune_pathways <- grep("immune|infection|virus", ego$Description, ignore.case=TRUE) go_data <- go_data[immune_pathways, ]
  • 颜色自定义:使用RColorBrewer创建专业配色

    library(RColorBrewer) term_colors <- brewer.pal(term_num, "Set1")

在实际项目中,KEGG圈图能够直观展示关键基因在重要通路中的分布情况,特别是在研究疾病机制或药物靶点时,这种可视化方式能清晰呈现基因-通路网络关系。一个典型的应用场景是比较不同细胞亚群间的通路活性差异,通过并排展示多个圈图,可以直观发现各亚群的特异性通路特征。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 16:31:10

面馆开业!客官,你的面(经)好了!

经历了孤独且漫长的题库收集、网站搭建、服务器租赁、域名申请&#xff08;进行中&#xff09;&#xff0c;我们的面馆已经初具规模啦&#xff01; 面馆 大厂面试题库 项目处在测试和持续优化阶段&#xff0c;域名初步叫做noodleshome&#xff0c;旨在缓解大家到处找面经的疲…

作者头像 李华
网站建设 2026/5/8 16:30:59

如何用REFramework为RE引擎游戏创造无限可能?[特殊字符]

如何用REFramework为RE引擎游戏创造无限可能&#xff1f;&#x1f3ae; 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 你是否曾经玩着《生化危…

作者头像 李华
网站建设 2026/5/8 16:30:51

Ai2Psd:如何实现AI到PSD的无损矢量图层转换?

Ai2Psd&#xff1a;如何实现AI到PSD的无损矢量图层转换&#xff1f; 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 对于需要在Adobe Illustr…

作者头像 李华