当前位置:首页 > 技术 > 正文内容

使用 NetworkX 进行复杂网络分析与可视化

访客 技术 2026年6月1日 1

NetworkX 是 Python 生态中处理图结构数据的核心工具库,广泛应用于社交网络挖掘、路由优化、生物信息学等场景。本文将系统介绍其核心功能与实战技巧。

环境准备

pip install networkx matplotlib
import networkx as nx
import matplotlib.pyplot as plt

图结构的构建与分类

NetworkX 支持四种基础图模型,分别对应不同的业务场景:

类型类名适用场景
无向图Graph双向关系(如好友关系)
有向图DiGraph单向关系(如网页链接)
多重无向图MultiGraph多通道连接(如航班线路)
多重有向图MultiDiGraph多向多通道(如物流网络)
# 初始化各类图实例
undirected = nx.Graph()
directed = nx.DiGraph()
multi_undirected = nx.MultiGraph()
multi_directed = nx.MultiDiGraph()

节点与边的操作

图的元素支持任意可哈希对象作为标识,并允许挂载自定义属性:

# 批量添加节点并设置属性
undirected.add_nodes_from([
    ('node_1', {'category': 'source', 'priority': 1}),
    ('node_2', {'category': 'intermediate'}),
    ('node_3', {'category': 'target'})
])

# 创建带权重的连接
undirected.add_weighted_edges_from([
    ('node_1', 'node_2', 3.5),
    ('node_2', 'node_3', 2.8),
    ('node_1', 'node_3', 8.0)  # 直连通道
], weight='distance')

查询图的基本信息:

print(f"节点集合: {list(undirected.nodes())}")
print(f"边集合: {undirected.edges(data=True)}")
print(f"node_1 的邻接点: {list(undirected.adj['node_1'])}")
print(f"node_1 的度数: {undirected.degree['node_1']}")

属性管理与元数据

属性系统支持节点、边、图三个层级的数据存储:

# 节点级属性访问与修改
undirected.nodes['node_1']['status'] = 'active'
print(undirected.nodes['node_1'].get('status', 'unknown'))

# 边级属性动态更新
undirected['node_1']['node_2']['traffic'] = 1200

# 图级元数据
undirected.graph['project'] = 'urban_mobility'
undirected.graph['version'] = '2.1.0'

核心算法应用

路径优化

# 基于权重的最优路径
optimal_route = nx.shortest_path(
    undirected, 
    source='node_1', 
    target='node_3',
    weight='distance'
)
route_cost = nx.shortest_path_length(
    undirected,
    source='node_1',
    target='node_3',
    weight='distance'
)

网络连通性分析

# 识别孤立子网络
subgraphs = [comp for comp in nx.connected_components(undirected)]
print(f"发现 {len(subgraphs)} 个连通分量")

# 检查特定节点的可达范围
reachable = nx.node_connected_component(undirected, 'node_1')

中心性度量

centrality_metrics = {
    'degree': nx.degree_centrality(undirected),
    'closeness': nx.closeness_centrality(undirected),
    'betweenness': nx.betweenness_centrality(undirected),
    'eigenvector': nx.eigenvector_centrality(undirected, max_iter=1000)
}

社区结构探测

from networkx.algorithms import community

# 使用 Girvan-Newman 算法进行层次化社区划分
hierarchy = community.girvan_newman(undirected)
first_partition = next(hierarchy)
print(f"第一层划分结果: {first_partition}")

可视化定制

结合 Matplotlib 实现专业级网络可视化:

# 布局算法选择
layout = nx.kamada_kawai_layout(undirected)  # 力导向布局

# 基于节点属性映射颜色
node_colors = [
    'coral' if undirected.nodes[n].get('priority') == 1 else 'lightblue'
    for n in undirected.nodes()
]

# 基于边权重映射宽度
edge_widths = [
    d.get('distance', 1.0) * 0.8 
    for u, v, d in undirected.edges(data=True)
]

fig, ax = plt.subplots(figsize=(10, 8))
nx.draw_networkx_nodes(undirected, layout, node_color=node_colors, node_size=800, ax=ax)
nx.draw_networkx_edges(undirected, layout, width=edge_widths, alpha=0.6, ax=ax)
nx.draw_networkx_labels(undirected, layout, font_size=10, ax=ax)
ax.set_title("城市交通网络拓扑")
plt.tight_layout()
plt.show()

数据持久化

# 导出为标准交换格式
nx.write_graphml(undirected, "network.graphml")      # 通用格式
nx.write_gml(undirected, "network.gml")              # 兼容 Cytoscape
nx.write_gexf(undirected, "network.gexf")            # Gephi 专用

# 从文件恢复
loaded_network = nx.read_graphml("network.graphml")

综合案例:供应链网络优化

以下示例构建一个包含工厂、仓库、零售节点的供应链网络,并进行关键节点识别:

# 构建供应链有向图
supply_chain = nx.DiGraph()

# 三层节点结构
factories = ['F1', 'F2', 'F3']
warehouses = ['W1', 'W2', 'W3', 'W4']
retailers = ['R1', 'R2', 'R3', 'R4', 'R5']

supply_chain.add_nodes_from(factories, layer='production', capacity=5000)
supply_chain.add_nodes_from(warehouses, layer='distribution', capacity=2000)
supply_chain.add_nodes_from(retailers, layer='sales', demand=800)

# 建立层级连接
factory_to_warehouse = [
    ('F1', 'W1', {'cost': 12, 'lead_time': 2}),
    ('F1', 'W2', {'cost': 15, 'lead_time': 3}),
    ('F2', 'W2', {'cost': 10, 'lead_time': 2}),
    ('F2', 'W3', {'cost': 14, 'lead_time': 4}),
    ('F3', 'W3', {'cost': 11, 'lead_time': 2}),
    ('F3', 'W4', {'cost': 13, 'lead_time': 3}),
]

warehouse_to_retail = [
    ('W1', 'R1', {'cost': 5, 'lead_time': 1}),
    ('W1', 'R2', {'cost': 6, 'lead_time': 1}),
    ('W2', 'R2', {'cost': 4, 'lead_time': 1}),
    ('W2', 'R3', {'cost': 7, 'lead_time': 2}),
    ('W3', 'R3', {'cost': 5, 'lead_time': 1}),
    ('W3', 'R4', {'cost': 6, 'lead_time': 2}),
    ('W4', 'R4', {'cost': 5, 'lead_time': 1}),
    ('W4', 'R5', {'cost': 8, 'lead_time': 2}),
]

supply_chain.add_edges_from(factory_to_warehouse)
supply_chain.add_edges_from(warehouse_to_retail)

# 识别关键中转节点(介数中心性)
hub_importance = nx.betweenness_centrality(supply_chain, weight='cost')
critical_hubs = sorted(hub_importance.items(), key=lambda x: x[1], reverse=True)[:3]
print(f"核心中转节点: {[n for n, _ in critical_hubs]}")

# 计算最小成本流
min_cost_flow = nx.min_cost_flow(supply_chain, demand='demand', capacity='capacity')

性能优化建议

  • 大规模网络(>10⁴节点)建议使用 graph-tooligraph 作为后端
  • 频繁查询场景可预计算邻接矩阵转换为 SciPy 稀疏矩阵
  • 并行计算可利用 joblib 对独立子图进行分布式处理

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。