Skip to content

graph

库 NetworkX

应用:

维度NetworkX 图对象igraph 图对象
数据结构底层纯 Python 实现,基于字典(dict)存储节点和边,灵活性高但效率低。底层用 C 语言实现,采用更紧凑的内存结构(如数组),内存占用小、运算快。
算法支持支持基础算法(如最短路径、连通分量),但复杂算法(如 Leiden 社区检测)需依赖第三方库或自定义实现。内置大量高级算法(如 Leiden/Louvain 社区检测、谱聚类、最大流等),且优化充分。
属性管理节点和边的属性通过字典灵活存储(如 G.nodes[u]['attr']),但查询和批量操作效率低。属性通过向量(VertexSeq/EdgeSeq)管理,支持批量操作(如 g_ig.vs['attr'] 直接获取所有节点属性),效率更高。
可视化内置简单可视化(依赖 Matplotlib),但交互性差,适合快速预览。支持高质量静态可视化(内置 Cairo 后端)和自定义样式,且可导出为多种格式(PDF/PNG 等)。
大规模图支持处理超过 10 万节点 / 边时速度明显变慢,内存占用大。可高效处理百万级甚至千万级节点 / 边的图,适合工业级数据。

创建一个无向图(Undirected Graph)

python
# 创建空的无向图NETworkX对象
G = nx.Graph()

# 添加节点
G.add_node(1)  # 单个节点
G.add_nodes_from([2, 3, 4])  # 批量添加节点

# 添加边
G.add_edge(1, 2)  # 节点 1 和 2 之间的边
G.add_edges_from([(2, 3), (3, 4), (4, 1)])  # 批量添加边

# 查看图的基本信息
print("节点:", G.nodes())  # 输出:节点:[1, 2, 3, 4]
print("边:", G.edges())    # 输出:边:[(1, 2), (2, 3), (3, 4), (4, 1)]

检查边函数

python
G = nx.Graph()
G.add_edges_from([(1, 2), (2, 3)])

print(G.has_edge(1, 2))  # 输出:True(存在边 1-2)
print(G.has_edge(1, 3))  # 输出:False(不存在边 1-3)

将 NetworkX 图对象 转换为 igraph 图对象(这个存在的目的是小项目,但是啊要用Leiden算的发检测社区)

python
import networkx as nx
import igraph as ig

# 1. 用 NetworkX 创建带属性的图
G = nx.Graph()
G.add_node(1, label="A")  # 节点 1 带属性 label="A"
G.add_node(2, label="B")
G.add_edge(1, 2, weight=5)  # 边带权重属性

# 2. 转换为 igraph 图
g_ig = ig.Graph.from_networkx(G)

# 3. 查看转换结果
print("igraph 节点 ID:", g_ig.vs["name"])  # 节点 ID 保留(默认与 NetworkX 一致)
print("节点属性 label:", g_ig.vs["label"])  # 节点属性同步
print("边权重:", g_ig.es["weight"])  # 边属性同步

使用场景对比

  • 优先用 NetworkX 图对象的场景

    • 快速构建和探索小规模图(如演示、教学、原型开发)。
    • 需要灵活处理非结构化属性(如节点 / 边的多类型标签)。
    • 依赖 Python 生态的其他库(如 Pandas)进行数据联动。
  • 优先用 igraph 图对象的场景

    • 执行复杂算法(如社区检测、大规模网络的中心性计算)。
    • 处理百万级以上节点 / 边的大图(如社交网络、交通网络)。
    • 需要高效的批量属性操作或高性能计算。

库PyVis

作用

PyVis 是一个用于创建交互式网络可视化的 Python 库,通过该方法可以将 NetworkX 构建的图(如 nx.Graph() 创建的无向图)转换为 PyVis 的 Network 对象,从而实现网页交互式展示(如节点拖拽、缩放、悬停显示信息等)

python
import networkx as nx
from pyvis.network import Network

# 1. 用 NetworkX 创建图
nx_graph = nx.Graph()
nx_graph.add_edges_from([(1, 2), (2, 3), (3, 1), (1, 4)])  # 添加边

# 2. 转换为 PyVis 图对象
pyvis_graph = Network.from_networkx(nx_graph)

# 3. 保存为 HTML 文件(可在浏览器中打开查看交互式图)
pyvis_graph.show("network.html")