宏基因组功能注释——eggNOG-mapper实战¶
一句话概述¶
eggNOG-mapper是基于eggNOG数据库的快速功能注释工具,可将蛋白质序列一步映射到COG类别、KEGG通路、GO术语等多种功能分类体系,是宏基因组功能注释的首选工具之一。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| eggNOG数据库 | evolutionary genealogy of genes: Non-supervised Orthologous Groups,包含>5000个物种的直系同源基因簇 |
| OG (Orthologous Group) | 直系同源基因组,由进化树推断的功能等价基因集合 |
| COG分类 | Clusters of Orthologous Groups,25个功能大类(如J=翻译、K=转录) |
| KEGG注释 | 将基因映射到KEGG通路、KO编号 |
| GO注释 | Gene Ontology三大类:分子功能(MF)、生物过程(BP)、细胞组分(CC) |
| emapper.py | eggNOG-mapper的核心命令行程序 |
| DIAMOND | eggNOG-mapper默认的序列比对引擎(比BLAST快500-20000x) |
| MMseqs2 | 可选的更快比对引擎 |
| seed_orthologs | eggNOG中用于构建OG的参考序列 |
| 税级限制(tax_scope) | 限制搜索的分类学范围以提高准确性和速度 |
各步骤详解¶
第一步:理解eggNOG数据库结构¶
白话解释: eggNOG把来自数千个物种的蛋白质按进化关系分组。同一组里的蛋白质来自共同祖先,大概率有相同功能。不同分类层级(如细菌域、变形菌门)都有对应的分组。
技术细节: - eggNOG v5.0包含4.4M个OGs,覆盖5090个物种(注:eggNOG最新版为v7,覆盖12535个物种、3.18M个OGs,但eggNOG-mapper v2仍默认使用v5.0数据) - 每个OG包含多层信息:COG category、KEGG KO、GO terms、EC number、CAZy、PFAM等 - 数据库按分类学层级组织:2(bacteria)、2157(archaea)、2759(eukaryota)等 - 本地数据库约60-100GB(全量)
数据库层级示例:
eggNOG v5.0(eggNOG-mapper v2 默认数据库)
├── root (LUCA level)
├── Bacteria (tax_id=2)
│ ├── Proteobacteria (tax_id=1224)
│ │ ├── Gammaproteobacteria
│ │ └── Alphaproteobacteria
│ └── Firmicutes (tax_id=1239)
├── Archaea (tax_id=2157)
└── Eukaryota (tax_id=2759)
第二步:安装eggNOG-mapper¶
白话解释: 安装emapper有两种方式:conda安装程序本体 + 下载配套数据库。数据库很大,需要提前准备。
代码示例:
# 方法1:conda安装(推荐)
conda create -n emapper python=3.9
conda activate emapper
conda install -c bioconda eggnog-mapper
# 方法2:pip安装
pip install eggnog-mapper
# 方法3:源码安装
git clone https://github.com/eggnogdb/eggnog-mapper.git
cd eggnog-mapper
pip install .
# 下载数据库(必须!约45GB)
download_eggnog_data.py --data_dir /data/eggnog_db/ -y
# 下载DIAMOND数据库(核心)
download_eggnog_data.py -D --data_dir /data/eggnog_db/ -y
# 下载特定tax scope的HMM数据库(可选,用于hmmer模式)
download_eggnog_data.py -H -d 2 --data_dir /data/eggnog_db/ -y # bacteria
download_eggnog_data.py -H -d 2157 --data_dir /data/eggnog_db/ -y # archaea
# 验证安装
emapper.py --version
emapper.py --data_dir /data/eggnog_db/ --list_taxa
第三步:输入文件准备¶
白话解释: eggNOG-mapper的输入是蛋白质序列(FASTA格式)。在宏基因组分析中,通常先用Prodigal等工具从组装的contigs预测ORF,再将翻译后的蛋白质序列提交注释。
技术细节: - 输入格式:FASTA(蛋白质或核苷酸) - 推荐使用蛋白质序列(更灵敏) - 序列ID不要含有特殊字符(空格、#等) - 大数据集建议拆分(每份100k-500k条序列)并行处理
代码示例:
# 从组装的contigs预测ORF(使用Prodigal)
prodigal -i assembled_contigs.fa \
-o genes.gff \
-a proteins.faa \ # 蛋白质序列输出
-d genes.fna \ # 核苷酸序列输出
-p meta \ # 宏基因组模式
-f gff
# 检查蛋白序列数量
grep -c ">" proteins.faa
# 清理序列头(去除Prodigal额外信息)
sed 's/ .*//' proteins.faa > proteins_clean.faa
# 大文件拆分
# 拆成每份10万条序列
awk 'BEGIN{n=0; file="split_00.faa"} /^>/{n++; if(n%100000==1){file=sprintf("split_%02d.faa",n/100000)}} {print > file}' proteins_clean.faa
# 或使用seqkit拆分
seqkit split2 -s 100000 proteins_clean.faa -O split_dir/
第四步:运行eggNOG-mapper¶
白话解释: 核心命令就是emapper.py,指定输入文件、输出前缀和数据库路径即可。它先做序列比对找到最佳匹配的OG,再把OG对应的所有注释转移给你的序列。
技术细节: - 搜索模式:diamond(默认)、mmseqs、hmmer - DIAMOND模式最常用:快速,适合大数据集 - HMMer模式更灵敏但更慢,适合远缘同源 - --tax_scope限制搜索范围可显著提升速度 - --go_evidence控制GO证据等级过滤
代码示例:
# === 基本运行 ===
emapper.py -i proteins_clean.faa \
--output sample1 \
--output_dir /results/emapper/ \
--data_dir /data/eggnog_db/ \
--cpu 16 \
--override
# === 宏基因组推荐参数 ===
emapper.py -i proteins_clean.faa \
-m diamond \
--itype proteins \
--tax_scope Bacteria \
--go_evidence non-electronic \
--target_orthologs all \
--seed_ortholog_evalue 1e-5 \
--seed_ortholog_score 60 \
--query_cover 20 \
--subject_cover 20 \
--output sample1_emapper \
--output_dir /results/emapper/ \
--data_dir /data/eggnog_db/ \
--cpu 32 \
--override \
--temp_dir /tmp/emapper/
# === 分步运行(大数据集推荐) ===
# 步骤1:搜索阶段(最耗时)
emapper.py -i proteins_clean.faa \
-m diamond \
--itype proteins \
--data_dir /data/eggnog_db/ \
--cpu 32 \
--no_annot \
--output sample1 \
--output_dir /results/emapper/ \
--override
# 步骤2:注释阶段(基于步骤1的结果)
emapper.py --annotate_hits_table /results/emapper/sample1.emapper.seed_orthologs \
--data_dir /data/eggnog_db/ \
--cpu 16 \
--go_evidence non-electronic \
--tax_scope Bacteria \
--output sample1 \
--output_dir /results/emapper/ \
--override
# === 使用MMseqs2(更快) ===
emapper.py -i proteins_clean.faa \
-m mmseqs \
--data_dir /data/eggnog_db/ \
--cpu 32 \
--output sample1_mmseqs \
--output_dir /results/emapper/ \
--override
第五步:解读输出结果¶
白话解释: emapper输出一个大表格(TSV),每行是一个查询蛋白,列包含它匹配到的OG、COG类别、KEGG KO号、GO terms等多维注释信息。
技术细节: - 核心输出文件:*.emapper.annotations - 主要列含义见下表 - 还会生成seed_orthologs文件(比对详情) - pfam/GO/KEGG等可能为空(并非所有蛋白都有完整注释)
输出列说明:
| 列名 | 含义 |
|---|---|
| query | 查询序列ID |
| seed_ortholog | 最佳匹配的eggNOG seed序列 |
| evalue | E-value |
| score | 比对得分 |
| eggNOG_OGs | 匹配的OG(多层级) |
| COG_category | COG功能分类字母(可多个) |
| Description | 功能描述 |
| Preferred_name | 基因名缩写 |
| GOs | GO terms(逗号分隔) |
| KEGG_ko | KEGG KO编号 |
| KEGG_Pathway | KEGG通路 |
| KEGG_Module | KEGG模块 |
| PFAMs | PFAM域 |
| CAZy | 碳水化合物活性酶分类 |
| EC | 酶分类编号 |
代码示例:
# 查看输出文件结构
head -5 sample1_emapper.emapper.annotations
# 统计注释率
total=$(grep -c ">" proteins_clean.faa)
annotated=$(grep -v "^#" sample1_emapper.emapper.annotations | wc -l)
echo "Annotation rate: $annotated / $total = $(echo "scale=2; $annotated*100/$total" | bc)%"
# 提取COG分类统计
grep -v "^#" sample1_emapper.emapper.annotations | \
cut -f7 | grep -v "^-$" | grep -o . | sort | uniq -c | sort -rn
# 提取KEGG KO列表
grep -v "^#" sample1_emapper.emapper.annotations | \
cut -f12 | grep -v "^-$" | tr ',' '\n' | sort -u > kegg_ko_list.txt
# 提取GO terms
grep -v "^#" sample1_emapper.emapper.annotations | \
cut -f10 | grep -v "^-$" | tr ',' '\n' | sort -u > go_terms_list.txt
第六步:下游分析与可视化¶
白话解释: 拿到注释结果后,通常做:(1) COG功能分类柱状图;(2) KEGG通路富集分析;(3) 多样本间功能差异比较。
代码示例:
# R语言处理emapper结果
library(tidyverse)
# 读取注释结果
emapper <- read_tsv("sample1_emapper.emapper.annotations",
comment = "##",
col_names = TRUE)
# === COG分类统计与可视化 ===
cog_categories <- c(
"J" = "Translation", "A" = "RNA processing",
"K" = "Transcription", "L" = "Replication",
"B" = "Chromatin", "D" = "Cell cycle",
"Y" = "Nuclear structure", "V" = "Defense mechanisms",
"T" = "Signal transduction", "M" = "Cell wall",
"N" = "Cell motility", "Z" = "Cytoskeleton",
"W" = "Extracellular structures", "U" = "Intracellular trafficking",
"O" = "PTM/chaperones", "X" = "Mobilome",
"C" = "Energy production", "G" = "Carbohydrate metabolism",
"E" = "Amino acid metabolism", "F" = "Nucleotide metabolism",
"H" = "Coenzyme metabolism", "I" = "Lipid metabolism",
"P" = "Inorganic ion transport", "Q" = "Secondary metabolites",
"R" = "General function", "S" = "Function unknown"
)
# 提取并统计COG
cog_data <- emapper %>%
filter(COG_category != "-") %>%
mutate(COG_split = strsplit(COG_category, "")) %>%
unnest(COG_split) %>%
count(COG_split) %>%
mutate(description = cog_categories[COG_split])
# 画图
ggplot(cog_data, aes(x = reorder(COG_split, -n), y = n, fill = COG_split)) +
geom_bar(stat = "identity") +
labs(x = "COG Category", y = "Gene Count",
title = "COG Functional Classification") +
theme_minimal() +
theme(legend.position = "none")
# === KEGG通路分析 ===
# 提取KO编号
ko_list <- emapper %>%
filter(KEGG_ko != "-") %>%
separate_rows(KEGG_ko, sep = ",") %>%
mutate(KEGG_ko = str_remove(KEGG_ko, "ko:"))
# 统计各KO出现频次
ko_counts <- ko_list %>%
count(KEGG_ko, sort = TRUE)
# 使用clusterProfiler做KEGG富集(需要转换)
library(clusterProfiler)
# 将KO映射到pathway
# enrichKEGG需要KEGG gene ID或KO ID
# === 多样本比较 ===
# 假设有多个样本的emapper结果
samples <- c("sample1", "sample2", "sample3")
all_cog <- map_dfr(samples, function(s) {
read_tsv(paste0(s, "_emapper.emapper.annotations"), comment = "##") %>%
filter(COG_category != "-") %>%
mutate(sample = s)
})
# Python处理emapper结果
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取注释结果
df = pd.read_csv("sample1_emapper.emapper.annotations",
sep="\t", comment="#",
header=0)
# KEGG模块统计
kegg_modules = df['KEGG_Module'].dropna()
kegg_modules = kegg_modules[kegg_modules != '-']
module_counts = kegg_modules.str.split(',').explode().value_counts().head(20)
# 可视化
fig, ax = plt.subplots(figsize=(10, 6))
module_counts.plot(kind='barh', ax=ax)
ax.set_xlabel('Gene Count')
ax.set_title('Top 20 KEGG Modules')
plt.tight_layout()
plt.savefig('kegg_modules.pdf')
实战命令(可复制)¶
# ===== 一站式宏基因组功能注释流程 =====
# 1. 从组装结果预测蛋白
prodigal -i final_contigs.fa -a proteins.faa -p meta -f gff -o genes.gff
# 2. 清理序列头
sed 's/ .*//' proteins.faa > proteins_clean.faa
# 3. 运行eggNOG-mapper(DIAMOND模式)
emapper.py -i proteins_clean.faa \
-m diamond \
--itype proteins \
--data_dir /data/eggnog_db/ \
--tax_scope Bacteria \
--go_evidence non-electronic \
--seed_ortholog_evalue 1e-5 \
--seed_ortholog_score 60 \
--cpu 32 \
--output metagenome_func \
--output_dir ./emapper_results/ \
--temp_dir /tmp/emapper_tmp/ \
--override
# 4. 统计注释率
echo "Total proteins: $(grep -c '>' proteins_clean.faa)"
echo "Annotated: $(grep -v '^#' emapper_results/metagenome_func.emapper.annotations | wc -l)"
# 5. 提取各功能分类
# COG
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
awk -F'\t' '$7!="-"' | cut -f1,7 > cog_assignments.tsv
# KEGG KO
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
awk -F'\t' '$12!="-"' | cut -f1,12 > kegg_ko_assignments.tsv
# GO
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
awk -F'\t' '$10!="-"' | cut -f1,10 > go_assignments.tsv
# PFAM
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
awk -F'\t' '$21!="-"' | cut -f1,21 > pfam_assignments.tsv
# 6. 可视化(使用R或Python脚本处理上述TSV文件)
面试常问点¶
Q1: eggNOG和COG/KOG有什么关系?¶
A: COG最初是NCBI基于原核生物基因组构建的直系同源基因簇;KOG是真核版本。eggNOG是COG/KOG的扩展和更新,覆盖更多物种(5000+),使用更先进的系统发育方法构建OG,且提供多层级分类学分辨率的OG。eggNOG v5.0兼容原COG分类字母体系。最新的eggNOG v7(2025年发布)采用全新的系统发育、结构域驱动方法构建OG,覆盖12535个物种。
Q2: eggNOG-mapper的搜索模式如何选择?¶
A: DIAMOND模式:默认推荐,速度快、灵敏度好,适合大多数场景尤其宏基因组。MMseqs2模式:比DIAMOND更快但略微降低灵敏度。HMMer模式:灵敏度最高但最慢,适合远缘同源检测或特定分类群的精确注释。
Q3: --tax_scope参数的作用和建议?¶
A: 限制搜索范围在特定分类学层级内。作用:(1) 加速搜索(数据库子集更小);(2) 提高注释准确性(避免跨域的错误匹配)。建议:宏基因组如果确定是细菌为主用Bacteria或Prokaryota;未知组成则用默认(auto);环境样本混合真核原核时用root。
Q4: 如何评估注释质量?¶
A: (1) 注释率:通常宏基因组蛋白40-70%能被注释;(2) E-value分布:多数应<1e-10;(3) 与其他注释工具对比(如InterProScan/KEGG官方KAAS)一致性;(4) 已知marker基因的注释是否正确;(5) COG类别分布是否合理(S类"未知功能"通常占比最高)。
Q5: eggNOG-mapper vs InterProScan vs KEGG GhostKOALA的优劣?¶
A: eggNOG-mapper:速度快,一步给出多维注释(COG/KEGG/GO/PFAM),适合大规模数据。InterProScan:最全面的域注释(整合PFAM/TIGRFAM/CDD等),但慢。GhostKOALA:KEGG官方工具,KO注释最权威,但有序列数限制且只给KEGG注释。最佳实践是组合使用。
Q6: 如何处理eggNOG-mapper注释率低的问题?¶
A: (1) 检查输入是否为蛋白质序列(核苷酸灵敏度低);(2) 降低evalue阈值(如1e-3)但要注意假阳性;(3) 放宽tax_scope(如从genus改到phylum或root);(4) 对未注释蛋白补充InterProScan域注释;(5) 检查是否有大量短片段(<60aa通常难注释)。
Q7: 如何将eggNOG-mapper结果用于比较宏基因组学?¶
A: (1) 用KEGG KO构建功能丰度表:KO×样本矩阵;(2) 各样本独立注释后合并统计;(3) 归一化方法:相对丰度或TPM/RPKM(结合定量工具如Salmon/CoverM);(4) 下游用LEfSe/MaAsLin2做组间差异功能分析。
Q8: eggNOG-mapper能注释的非蛋白功能有哪些?¶
A: 除了COG/KEGG/GO,还输出:(1) CAZy(碳水化合物活性酶)—— 适合分析降解能力;(2) EC number(酶分类);(3) PFAM域;(4) KEGG Module(代谢模块完整性);(5) BiGG反应(代谢建模用);(6) Preferred_name(通用基因名)。
易错点¶
1. 使用核苷酸序列作为输入但未指定--itype CDS¶
问题: 默认输入类型是蛋白质,核苷酸序列匹配会出错或效率极低。 正确做法: 使用蛋白质序列(推荐),或明确指定--itype CDS(会自动翻译)。
2. 数据库版本与软件版本不匹配¶
问题: emapper 2.1.x需要对应v5.0数据库;旧数据库会报错。 正确做法: 更新软件后重新下载数据库:download_eggnog_data.py -D -y。
3. 未设置--temp_dir导致/tmp空间不足¶
问题: DIAMOND搜索产生大量临时文件,默认写/tmp容易爆。 正确做法: 指定大容量临时目录:--temp_dir /scratch/tmp/。
4. 并行处理后结果合并遗漏header¶
问题: 拆分跑后简单cat合并,导致多个header行混在数据中。 正确做法: 只保留第一个文件的header:head -n 5 part1.annotations > merged.annotations; for f in part*.annotations; do grep -v "^#" $f >> merged.annotations; done
5. COG分类列包含多字母未正确拆分¶
问题: 一个蛋白可能属于多个COG类别(如"KL"表示转录+复制),直接统计会漏算。 正确做法: 将多字母COG拆分为单字母后逐个统计(见上文R代码)。
6. 忽略--query_cover和--subject_cover参数¶
问题: 默认覆盖率阈值可能过低,导致部分匹配被当作全长同源。 正确做法: 对于高质量注释设置--query_cover 50 --subject_cover 50;探索性分析可放宽。
7. 混淆KEGG_ko和KEGG_Pathway列¶
问题: KEGG_ko是KO编号(功能直系同源),KEGG_Pathway是通路编号,一对多映射。 正确做法: 先获取KO列表,再通过KEGG API或KEGG Mapper映射到通路并做富集分析。
补充知识¶
eggNOG-mapper与其他注释工具对比¶
| 工具 | 速度 | 注释维度 | 适用场景 |
|---|---|---|---|
| eggNOG-mapper | 快 | COG/KEGG/GO/PFAM/CAZy | 宏基因组批量注释 |
| InterProScan | 慢 | 所有域数据库 | 精确域结构注释 |
| GhostKOALA | 中 | KEGG only | 权威KEGG注释 |
| DRAM | 中 | 代谢聚焦 | MAG功能评估 |
| Prokka | 快 | 基因名/EC | 基因组快速注释 |
| dbCAN | 中 | CAZy only | 碳水化合物酶专项 |
高级用法¶
- 自定义HMM数据库:可以添加自己的HMM profile进行专项搜索
- 增量注释:新序列只搜索未注释部分,复用已有结果
- 与KEGG Mapper集成:将KO列表提交 KEGG Mapper 可视化通路覆盖
- MAG注释:对binning后的MAG单独注释,评估代谢完整性
注释结果深度利用¶
- 代谢通路完整性评估:使用KEGG Module Completeness判断某通路是否完整存在于样本中
- CAZy分析:碳水化合物降解潜力评估(与dbCAN交叉验证)
- 抗性基因/毒力因子:eggNOG注释中description字段可检索相关关键词,但专项分析推荐用CARD/VFDB
本教程覆盖了eggNOG-mapper从安装到结果解读的全流程,适合宏基因组功能注释初学者和进阶用户参考。