Matplotlib 绘制基于权重的 networkx 图的边的颜色
在本文中,我们将介绍如何使用Matplotlib绘制基于权重的 networkx 图的边的颜色。这个功能可以快速的表达出不同边的权重,以便于更好的理解这张图。首先介绍一下 Matplotlib 和 Networkx。
阅读更多:Matplotlib 教程
Matplotlib 简介
Matplotlib 是一个开放源代码的 pythong 数据可视化库,该库有助于创建二维,三维图表,直方图,散点图等图形,并能够可视化数据分析。Matplotlib 以各种各样的显示格式生成高质量的图表的目的是,以最少的代码实现数据可视化。
Networkx 简介
Networkx 是一个纯python 的基于基于复杂网络的工具集。他提供简单高效的数据类型和算法,包括以下特征:
- 底层原生Python数据结构
- 快速的图算法的实现
- 有向,无向和多图
- 权重,多重边和自环的图
- 丰富的图分析能力
有了Matplotlib 和 Networkx 的基础知识之后,我们可以开始使用这些工具来生成基于权重的 networkx 的边的颜色。
Matplotlib 染色方式
Matplotlib通过提供数值约定映射值颜色的方法,取代了颜色字符串。例如,我们可以使用 heatmap 显示来自一个二维数组的数据。
通过设置一些约定来完成此操作,其中既包括有助于读者直接代码可视化的选项,也包括提供足够的选项的 API,指定其细节自定义。Matplotlib 从以下几个方面定义了这些约定:
- colormap-颜色图,用于从数值映射到颜色空间。
- Norm-规范器,用于规范化数据以使色彩映射使用它们可以优化。
- Formatter-格式化程序,用于在图表上添加到各种位置的文本标注。
基于颜色的边权重
当我们使用 Networkx 绘制图时,通常使用单一颜色表示所有的边,但是这种方式不利于我们更好的表现不同边的权重,而基于权重的边颜色方案则可以解决这个问题。
在这个方案中,边的权重将映射到颜色空间,可以使用以下三种方法之一实现:
- 二元颜色映射,其中颜色编码边如果它的权重低于特定值,则为一种颜色,否则为另一种颜色。
- 渐变调色板,统一变化的颜色空间,根据权重调整分配的颜色。
- 多颜色调色板,边的颜色可以根据其具体的权重按不同方式映射。
我们可以通过将权重令一个元组作为关键字参数 edge_color_input 来实现此操作,例如:
G = nx.DiGraph() # 创建一个有向网格
G.add_edge('A', 'B', weight=3) # 第一条边
G.add_edge('B', 'C', weight=4) # 第二条边
G.add_edge('C', 'D', weight=2) # 第三条边
edge_color_list = [(u,v,d['weight']) for u,v,d in G.edges(data=True)]
edge_colors = [plt.cm.autumn((1./max(edge_color_list)[2])*weight) for weight in edge_color_list]
nx.draw(G, edge_color=edge_colors, with_labels=True) # 绘制网络
这个例子中的参数实现了一个类似渐变调色板的效果,其中 autumn
表示使用从橙色到红色渐变的调色板, max(edge_color_list)[2]
表示获取所有边中权重的最大值,以此来将权重映射到 [0, 1]
范围内,最终通过列表解析式将所有边的颜色分配到 edge_colors
列表中。
当我们执行完这段代码后,就会得到一个有向网络,每一条边的颜色都与其权重成比例。这样我们就可以更直观的看出不同边的权重了。
总结
在本文中,我们介绍了Matplotlib和Networkx,并且提供了一个使用 Matplotlib 来基于权重给网络的节点和边染色的例子。这项技术可帮助我们在绘制图表时更好地表现我们的数据,并提高我们的分析能力。当然,这只是其中的一个例子,在实际使用中我们可以根据自己的需求来定义和使用不同的配色方案。