生物医学网络科学Biomedical Network Science
网络分析流程与 NetworkX 实践03 / 16

NetworkX 上手

阅读
约 2 分钟

NetworkX 是 Python 中最常用的网络分析库,接口友好,适合中小规模网络(数万节点以内)。在本地使用时,建议用 Anaconda 或 pip install networkx numpy scipy matplotlib pandas 安装。

数据结构与图类型

NetworkX 把图存成嵌套字典:G.adj[u][v] 是边 (u,v)(u,v) 的属性字典,G.nodes[u] 是节点属性字典。节点可以是任何可哈希的 Python 对象(字符串、整数、元组),边可以携带任意属性。这种设计非常灵活,也解释了它在大规模网络上较慢、占内存较多的原因:每条边都是若干个 Python 字典条目,而不是数组中的一个整数。

类 有向 允许重边 典型用途
nx.Graph 否 否(允许自环) PPI、共表达、功能连接
nx.DiGraph 是 否 转录调控、信号通路、代谢反应方向、有效连接
nx.MultiGraph 否 是 同一对蛋白被多项实验分别报告、多种证据类型并存
nx.MultiDiGraph 是 是 知识图谱中同一对实体之间的多种关系

大多数指标(聚集系数、社团检测、许多中心性)只为 Graph 或 DiGraph 设计,对多重图要么不支持,要么含义不清。通常的做法是先把重边按明确规则聚合(计数、求和、取最大)为简单图,见常见计算陷阱。

构建与读入

import networkx as nx

G = nx.Graph()                    # 无向图;有向图用 nx.DiGraph()
G.add_edge("TP53", "MDM2")        # 加边时自动加节点
G.add_edge("TP53", "EP300", weight=0.9)
G.add_edges_from([("MDM2", "MDM4"), ("EP300", "CREBBP")])

# 从边列表文件读入(每行 "a b" 或 "a b 0.9")
# G = nx.read_edgelist("ppi.txt", data=(("weight", float),))
# 从 pandas 表读入
# G = nx.from_pandas_edgelist(df, "protein1", "protein2", edge_attr="score")

print(G.number_of_nodes(), G.number_of_edges())

一个最小的完整分析

G = nx.karate_club_graph()
G = G.subgraph(max(nx.connected_components(G), key=len)).copy()   # 取最大连通分支
deg = dict(G.degree())
print("平均度", sum(deg.values()) / G.number_of_nodes())
print("平均聚集系数", nx.average_clustering(G))
print("平均最短路径", nx.average_shortest_path_length(G))
comms = nx.community.louvain_communities(G, seed=1)
print("社团数", len(comms), "模块度 Q =", nx.community.modularity(G, comms))

注意 G.subgraph(...) 返回的是原图的“视图”,原图改变时它随之改变,并且不能增删节点;需要独立对象时加 .copy()。

本专题的代码示例把这几行扩展为九个完整示例:读入与清洗边表、指标与中心性计算、社团发现与稳定性、与模型网络和零模型比较、格式互转、计算陷阱、大规模计算策略、布局比较,以及一个从原始数据到结论的完整案例。