You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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导入验证

  1. 导入生成的GraphML文件,节点会自动显示原始基因名作为标签
  2. 打开Node Table,可以看到betweenness和pagerank属性
  3. 使用ClusterMaker插件时,选择PageRank聚类算法,指定pagerank作为输入属性即可正常生成聚类结果

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:50:24