iGraph子图导入Cytoscape做PageRank聚类无标签排名问题排查
代码问题排查与修正方案
关键问题梳理
你的代码导致Cytoscape中无节点标签、缺失聚类所需属性,主要有三个核心问题:
- 节点原始基因名被编码覆盖,未绑定为节点标签属性
- 图生成时未正确传递节点名称信息
- 未提前计算PageRank等聚类所需的节点属性,且子图筛选逻辑未确保属性继承
分步修正
1. 保留原始基因名,避免编码覆盖
原代码直接把TF、Target列转成数字,丢失了原始基因名。改成新增编码列,保留原始列用于节点标签:
# 新增编码列,不修改原始TF/Target列 enc = OrdinalEncoder() df['TF_encoded'] = enc.fit_transform(df[['TF']]).astype(int) df['Target_encoded'] = enc.transform(df[['Target']]).astype(int)
2. 为节点绑定原始基因名(Cytoscape默认标签)
Cytoscape会识别节点的name属性作为显示标签,所以构建图时要把原始基因名赋值给节点的name字段:
# 用编码后的列构建边元组 tuples = list(df[['TF_encoded', 'Target_encoded', 'Importance']].itertuples(index=False)) G = Graph.TupleList(tuples, directed=True, edge_attrs=['Importance']) # 建立编码值到原始基因名的映射 node_mapping = {} for _, row in df.iterrows(): node_mapping[row['TF_encoded']] = row['TF'] node_mapping[row['Target_encoded']] = row['Target'] # 给每个节点设置name属性 G.vs['name'] = [node_mapping[int(v['name'])] for v in G.vs]
3. 计算聚类所需属性并生成子图
添加介数、PageRank等属性,确保子图继承所有节点/边属性,方便Cytoscape后续聚类:
# 计算节点介数并添加为属性 btwn = G.betweenness(weights='Importance') G.vs['betweenness'] = btwn # 筛选介数前1%的节点 ntile = np.percentile(btwn, 99) pruned_vs = G.vs.select(betweenness_ge=ntile) pruned_graph = G.subgraph(pruned_vs) # 计算PageRank并添加为节点属性(供ClusterMaker使用) pruned_graph.vs['pagerank'] = pruned_graph.pagerank(weights='Importance') # 导出GraphML pruned_graph.write_graphml("pruned_topgenes_directed_networks.graphml")
完整修正代码
import igraph as ig from igraph import Graph import pandas as pd from sklearn.preprocessing import OrdinalEncoder import numpy as np # 示例数据 df = pd.DataFrame({'TF': {0: 'ZFY', 1: 'ZFY', 2: 'ZFY', 3: 'ZFY', 4: 'ZFY'}, 'Target': {0: 'DDX3Y', 1: 'EIF1AY', 2: 'CYorf15A', 3: 'USP9Y', 4: 'KDM5D'}, 'Importance': {0: 271.64476419966564, 1: 249.63252368981105, 2: 249.47948849863877, 3: 242.14502589211688, 4: 215.67076799218304}}) # 1. 编码但保留原始基因名 enc = OrdinalEncoder() df['TF_encoded'] = enc.fit_transform(df[['TF']]).astype(int) df['Target_encoded'] = enc.transform(df[['Target']]).astype(int) # 2. 构建图并设置节点标签 tuples = list(df[['TF_encoded', 'Target_encoded', 'Importance']].itertuples(index=False)) G = Graph.TupleList(tuples, directed=True, edge_attrs=['Importance']) node_mapping = {} for _, row in df.iterrows(): node_mapping[row['TF_encoded']] = row['TF'] node_mapping[row['Target_encoded']] = row['Target'] G.vs['name'] = [node_mapping[int(v['name'])] for v in G.vs] # 3. 生成子图并添加聚类属性 btwn = G.betweenness(weights='Importance') G.vs['betweenness'] = btwn ntile = np.percentile(btwn, 99) pruned_vs = G.vs.select(betweenness_ge=ntile) pruned_graph = G.subgraph(pruned_vs) pruned_graph.vs['pagerank'] = pruned_graph.pagerank(weights='Importance') pruned_graph.write_graphml("pruned_topgenes_directed_networks.graphml")
Cytoscape导入验证
- 导入生成的GraphML文件,节点会自动显示原始基因名作为标签
- 打开Node Table,可以看到
betweenness和pagerank属性 - 使用ClusterMaker插件时,选择PageRank聚类算法,指定
pagerank作为输入属性即可正常生成聚类结果
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

