如何用Python为直系同源组基因计数表绘制Upset图?
Python实现Orthofinder结果的Upset图绘制
1. 数据格式转换(生成group_memberships)
假设你的Orthofinder输出是基因计数表(结构示例如下),核心是把每个Orthogroup对应的存在基因的物种提取出来,形成Upset图所需的组-成员映射:
| Orthogroup | SpeciesA | SpeciesB | SpeciesC |
|---|---|---|---|
| OG0000001 | 2 | 1 | 0 |
| OG0000002 | 0 | 3 | 2 |
| OG0000003 | 1 | 1 | 1 |
执行以下代码完成转换:
import pandas as pd # 读取Orthofinder基因计数表 df = pd.read_csv("Orthogroups.GeneCount.csv") # 提取所有物种列(排除Orthogroup列) species_cols = df.columns[1:] # 生成group_memberships:键为Orthogroup,值为该组存在基因的物种列表 group_memberships = {} for _, row in df.iterrows(): og_id = row["Orthogroup"] # 筛选基因数>0的物种 present_species = [col for col in species_cols if row[col] > 0] group_memberships[og_id] = present_species
如果你的输入是基因列表格式(如Orthogroups.tsv,物种列存逗号分隔的基因名),只需把判断条件改为pd.notna(row[col]) and row[col] != ""即可。
2. 计算物种总基因计数(组大小)
要在Upset图侧边显示每个物种的总基因数,单独统计:
# 基因计数表直接求和 species_total = df[species_cols].sum().to_dict() # 基因列表格式的统计方式(拆分基因名并计数) # species_total = {} # for col in species_cols: # total = df[col].dropna().apply(lambda x: len(x.split(","))).sum() # species_total[col] = total
3. 绘制带组大小的Upset图
使用upsetplot库完成绘图,支持自定义组大小显示:
from upsetplot import UpSet, from_memberships import matplotlib.pyplot as plt # 将group_memberships转换为upsetplot兼容格式 upset_data = from_memberships(group_memberships.values(), data=pd.Series(group_memberships.keys())) # 绘制Upset图,配置组大小和显示参数 plot = UpSet( upset_data, show_counts=True, # 显示每个交集的Orthogroup数量 element_size=40, group_sizes=species_total # 侧边显示物种总基因数 ) # 调整布局并展示 plot.plot() plt.tight_layout() plt.show()
关键调整说明
- 若之前脚本返回基因计数而非物种名称,是因为未筛选存在基因的物种,按上述代码通过
row[col] > 0(或基因列表非空)提取物种名称即可解决。 - 若需显示每个交集的总基因数(而非Orthogroup数量),可修改数据转换逻辑:
# 计算每个Orthogroup的总基因数 df["total_genes"] = df[species_cols].sum(axis=1) # 生成带基因计数的upset数据 upset_data = from_memberships( group_memberships.values(), data=df.set_index("Orthogroup")["total_genes"] )
内容的提问来源于stack exchange,提问作者zkrt
相关产品推荐
相关产品推荐

