← 返回目录

Chapter 13: 图的可视化

用NetworkX可视化图

🎨 节点布局•🌈 节点装饰•━ 边装饰•🎯 分别绘制

关于图的可视化

图的可视化是图论和网络分析中的重要环节。一个好的可视化方案可以帮助我们: 理解图的结构、发现模式、传达洞察。NetworkX提供了丰富的可视化功能, 从节点布局到节点和边的装饰,再到分别绘制节点和边的高级技巧。

本章将介绍draw_networkx()的基本用法,以及draw_networkx_nodes()、draw_networkx_edges()、draw_networkx_labels()等更精细的绘制函数。

✦
13.1

节点位置

布局算法决定图的整体结构

节点位置布局是图可视化的基础。NetworkX提供了多种布局算法:弹簧布局(spring_layout)模拟节点间的弹簧力和斥力关系;圆周布局(circular_layout)将节点均匀分布在圆周上;随机布局(random_layout)随机放置节点; 此外还支持自定义布局,手动指定特定节点的位置。

💻 常用布局算法

• spring_layout:力导向布局,最常用
• circular_layout:圆周布局
• random_layout:随机布局
• shell_layout:同心圆布局
• spectral_layout:谱布局
• kamada_kawai_layout:Kamada-Kawai布局

🎯 布局选择建议

• 一般图:spring_layout(力导向)
• 循环结构:circular_layout
• 层次结构:shell_layout
• 地理数据:自定义布局(真实坐标)
• 时间序列:根据时间排列
✦
13.2

节点装饰

大小、颜色、形状、透明度

节点装饰用于编码节点的属性。节点大小可以表示重要性、权重或度数;节点颜色可以表示分类、聚类或连续属性值;节点形状可以区分不同类型的节点;透明度可以突出重点或显示置信度。 NetworkX支持颜色映射(colormap),可以将连续值映射到颜色渐变。

🎨 图着色问题

图着色问题起源于地图着色:用不同的颜色为地图不同区域着色, 要求相邻区域颜色不同,并且整张地图所用颜色种类最少。

graph_color_code = nx.greedy_color(G)
贪心着色算法:按节点顺序依次选择可用的最小颜色编号

十二面体图(dodecahedral graph)是柏拉图图的一种,有20个节点、30条边, 使用贪心着色算法可以用4种颜色完成着色。

✦
13.3

边装饰

颜色、线宽、线型、选择性绘制

边装饰用于编码边的属性。线宽可以表示边的权重或强度;颜色可以区分不同类型或权重的边;线型(实线、虚线)可以区分强弱连接;选择性绘制可以过滤噪声边,只显示重要的连接。 通过列表生成式和条件过滤,可以灵活控制要显示的边。

鸢尾花数据欧氏距离图(图8、图9)

基于鸢尾花数据前两个特征的欧氏距离矩阵可以构造图。 图8展示了所有边和过滤后的边的对比,图9展示了距离矩阵热图和距离分布直方图。 这个例子体现了"图就是矩阵,矩阵就是图"的核心思想。

📊 边装饰参数

edge_color: 边颜色(单色或列表)
width: 边线宽(数值或列表)
style: 线型('solid', 'dashed', 'dotted')
edge_cmap: 边颜色映射

🔍 选择性绘制技巧

使用列表生成式过滤边:

edge_kept = [(u, v) for (u, v, d) in G.edges(data=True) if d["weight"] <= 0.5]

指定要绘制的边:

nx.draw_networkx(G, edgelist=edge_kept)
✦
13.4

分别绘制节点和边

更精细的可视化控制

对于复杂的图可视化需求,draw_networkx()可能不够灵活。 NetworkX提供了draw_networkx_nodes()、draw_networkx_edges()、draw_networkx_labels()、draw_networkx_edge_labels()等函数, 允许分别绘制节点和边,实现更精细的控制。 例如:不同权重的边使用不同线型和颜色,按度数渲染节点大小和颜色。

🌈 图12:有向图+颜色条

有向图增加颜色条(colorbar),展示节点度数与颜色的映射关系。

• 边用箭头表示方向
• 节点颜色映射度数值
• 颜色条标注数值范围

在组件中选择"🌈 颜色条"模式查看效果

🏷️ 图13:节点标签

每个节点都用draw_networkx_labels()增加了自定义标签。

• 使用希腊字母等特殊符号
• 红蓝两色区分节点类型
• 标签清晰可读
labels = {0:'a', 1:'β', 2:'c'}
nx.draw_networkx_labels(G, pos, labels)

📊 图14:按度数渲染

根据节点度数大小用颜色映射和大小渲染节点。

• 节点大小 ∝ 度数
• 节点颜色映射度数
• for循环分组绘制

这是一个包含400个节点的随机几何图,展示了度数分布的可视化效果。

🎯 分别绘制的优势

• 精细控制:独立控制节点和边的样式
• 分层渲染:先画边再画节点,避免遮挡
• 选择性显示:只显示特定节点或边
• 复杂场景:适合多类型节点和边的图
• 标签独立:节点标签和边标签分别添加
• 颜色条:可添加颜色条说明映射关系

🌸 鸢尾花数据示例

基于鸢尾花数据前两个特征的欧氏距离矩阵可以构造图。 这个例子展示了图就是矩阵,矩阵就是图的核心思想。

D = euclidean_distances(data)
G = nx.Graph(D, nodetype=int)

通过过滤距离大于0.5的边,可以减少噪声,突出局部结构。 使用不同颜色表示鸢尾花的三个类别,形成清晰的聚类可视化。

✦

本章小结

本章系统介绍了用NetworkX可视化图的各种技巧,从节点位置布局到节点和边的装饰, 再到分别绘制节点和边的高级方法。掌握这些技巧可以创建清晰、美观、信息丰富的图可视化。

🎨 核心函数

• nx.draw_networkx() - 一体化绘制
• nx.draw_networkx_nodes() - 绘制节点
• nx.draw_networkx_edges() - 绘制边
• nx.draw_networkx_labels() - 节点标签
• nx.draw_networkx_edge_labels() - 边标签
• nx.spring_layout() - 弹簧布局
• nx.circular_layout() - 圆周布局
• nx.greedy_color() - 贪心着色

💡 设计原则

• 布局优先:好的布局是可视化的基础
• 视觉层次:突出重要节点和边
• 颜色编码:使用对比色区分类别
• 避免过载:不要同时使用太多视觉通道
• 数据驱动:可视化参数应反映数据属性
• 交互探索:支持动态调整参数
💡
学习建议
• 动手尝试不同的布局算法,理解各自的适用场景
• 实验节点和边的装饰参数,找到最佳可视化方案
• 练习使用分别绘制函数,掌握更精细的控制
• 理解"图就是矩阵"的思想,尝试从矩阵构造图
• 参考NetworkX官方示例,学习更多可视化技巧