Python NetworkX 实现基于权重的可视化:区分实线与虚线

山海之间
山海之间
发布时间:2026-10-11| 2人浏览过
原创

本文介绍如何使用 Python 的 NetworkX 库绘制基于权重的加权图。通过遍历图的边并提取权重属性,将边划分为高权重(实线)和低权重(虚线)两组。利用 matplotlib 的 draw_networkx_edges 函数,分别设置线条宽度、透明度和样式,直观展示不同权重的连接关系。

核心实现思路

在 NetworkX 中绘制加权图时,直接调用绘图函数往往无法直观体现权重差异。为了实现“根据权重大小划分实边和虚边”的效果,核心逻辑分为以下三步:

  1. 输入边与权重:在构建图(Graph)时,为每条边指定具体的权重值(weight)。
  2. 划分边集合:遍历所有边,根据预设的阈值将边分为两组:一组为高权重边(用于绘制实线),另一组为低权重边(用于绘制虚线)。
  3. 差异化绘图:利用 matplotlib 的绘图接口,分别对两组边应用不同的样式(如宽度、透明度、线型)进行渲染。

代码实现步骤

1. 构建带权重的图

首先导入必要的库,并创建一个无向图对象。通过 add_edge 方法添加节点连接,并显式指定每个连接的权重值。权重数值的大小将作为后续划分实线和虚线的依据。

#coding:utf-8
#!/usr/bin/env python
"""
An example using Graph as a weighted network.
"""
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
try:
  import matplotlib.pyplot as plt
except:
  raise
 
import networkx as nx
 
G=nx.Graph()
#添加带权边
G.add_edge('a','b',weight=0.6)
G.add_edge('a','c',weight=0.2)
G.add_edge('c','d',weight=0.1)
G.add_edge('c','e',weight=0.7)
G.add_edge('c','f',weight=0.9)
G.add_edge('a','d',weight=0.3)

2. 按权重划分边集合

利用列表推导式遍历图的所有边(包含数据属性 data=True)。设定一个阈值(例如 0.5),将权重大于该值的边归入 elarge 列表,权重小于等于该值的边归入 esmall 列表。这一步是实现视觉区分的关键。

#按权重划分为重权值得边和轻权值的边
elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] >0.5]
esmall=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <=0.5]

3. 计算节点位置并绘图

使用 nx.spring_layout(G) 计算节点的布局位置,确保图形美观。接着,先绘制节点(draw_networkx_nodes),再分别绘制两组边:

  • 高权重边(实线):使用 nx.draw_networkx_edges,指定 edgelist=elarge,并设置较大的 width 以突出显示。
  • 低权重边(虚线):指定 edgelist=esmall,设置 width=6,同时添加 alpha=0.5 降低透明度,edge_color='b' 设置颜色,以及 style='dashed' 设置为虚线。
#节点位置
pos=nx.spring_layout(G) # positions for all nodes
#首先画出节点位置
# nodes
nx.draw_networkx_nodes(G,pos,node_size=700)
#根据权重,实线为权值大的边,虚线为权值小的边
# edges
nx.draw_networkx_edges(G,pos,edgelist=elarge,
          width=6)
nx.draw_networkx_edges(G,pos,edgelist=esmall,
          width=6,alpha=0.5,edge_color='b',style='dashed')

4. 添加标签与保存

最后,使用 nx.draw_networkx_labels 添加节点标签,关闭坐标轴显示,并将结果保存为 PNG 图片。

# labels标签定义
nx.draw_networkx_labels(G,pos,font_size=20,font_family='sans-serif')
 
plt.axis('off')
plt.savefig("weighted_graph.png") # save as png
plt.show() # display

总结

通过上述步骤,我们成功利用 NetworkX 和 Matplotlib 实现了基于权重的可视化。核心在于通过 Python 逻辑对边进行预处理和分类,再结合 Matplotlib 丰富的绘图参数(如 style, alpha, width)来呈现不同的视觉效果。这种方法不仅适用于简单的加权图,也可扩展至更复杂的网络分析场景中,帮助读者直观理解节点间连接的强弱关系。

以上就是 Python NetworkX 根据图的权重画图实现(区分实线与虚线)的详细内容,更多关于 Python 网络可视化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。