📜  使用 networkx 可视化图的组成二(1)

📅  最后修改于: 2023-12-03 15:36:32.218000             🧑  作者: Mango

使用 NetworkX 可视化图的组成二

在上一篇文章中,我们已经介绍了如何使用 NetworkX 创建和绘制图。但是,仅仅创建和绘制图并不能满足我们对图的需求。我们需要更深入地了解图的结构和信息。本文将介绍如何使用 NetworkX 可视化图的组成二。

组成二:节点和边

节点和边是图中最基本的元素。在 NetworkX 中,节点和边都可以包含任意的数据。节点和边的数据存储在节点对象和边对象的属性中。下面我们将一步步地介绍如何使用 NetworkX 访问节点和边的属性,并在绘图时利用节点和边的属性。

节点

节点的属性可以通过 G.nodes[node]G.node[node] 访问。其中,G 是我们创建的图对象,node 是节点的标识符。下面的代码演示了如何为节点添加属性,并访问节点的属性。

import networkx as nx

G = nx.Graph()
G.add_node(1, color='red')
G.add_node(2, color='blue')

node1 = G.nodes[1]
print(node1['color'])  # 输出 red

在这个例子中,我们为节点 1 和节点 2 分别添加了一个 color 属性,其值分别为 redblue。我们通过 G.nodes[1] 访问节点 1 对象,并通过 ['color'] 访问节点的属性。上面的代码将输出 red

除了如上例所示的用法,我们还可以使用 G.node[node] 的方式来访问节点的属性。在 NetworkX 2.0 及以上版本中,G.node[node]G.nodes[node] 的功能已经合并。

边的属性可以通过 G.edges[edge]G[edge[0]][edge[1]] 访问。其中,edge 是一个包含两个节点的元组,G 是我们创建的图对象。下面的代码演示了如何为边添加属性,并访问边的属性。

import networkx as nx

G = nx.Graph()
G.add_edge(1, 2, weight=2.0)

edge12 = G.edges[(1, 2)]
print(edge12['weight'])  # 输出 2.0

在这个例子中,我们为节点 1 和节点 2 之间的边添加了一个 weight 属性,其值为 2.0。我们通过 G.edges[(1, 2)] 访问边对象,并通过 ['weight'] 访问边的属性。上面的代码将输出 2.0

除了 G.edges[edge] 的用法,在 NetworkX 2.0 及以上版本中,我们还可以使用 G[edge[0]][edge[1]] 的方式访问边的属性。

在绘图时利用节点和边的属性

利用节点和边的属性,我们可以将不同的节点和边表示成不同的形状、不同的颜色、不同的大小、不同的标签等等。下面的代码演示了如何利用节点的 color 属性对不同的节点进行着色,并利用边的 weight 属性对不同的边进行着色。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edge(1, 2, weight=2.0)
G.add_edge(1, 3, weight=3.0)
G.add_edge(2, 3, weight=1.5)

node_colors = ['red' if node['color'] == 'red' else 'blue' for _, node in G.nodes(data=True)]
edge_colors = ['green' if edge['weight'] >= 2.0 else 'gray' for _, _, edge in G.edges(data=True)]

pos = nx.spring_layout(G)

nx.draw_networkx_nodes(G, pos, node_color=node_colors)
nx.draw_networkx_edges(G, pos, edge_color=edge_colors)

node_labels = {node: f"Node {node}" for node in G.nodes()}
nx.draw_networkx_labels(G, pos, labels=node_labels)

plt.axis('off')
plt.show()

在这个例子中,我们使用了 nx.spring_layout 将节点布局为弹簧模型,并使用了 nx.draw_networkx_nodesnx.draw_networkx_edges 绘制节点和边。节点的颜色由其 color 属性决定,边的颜色由其 weight 属性决定。

我们还使用了 nx.draw_networkx_labels 绘制节点的标签。节点的标签由字典 node_labels 决定,其中键为节点标识符,值为节点的标签。在本例中,节点的标签为 Node 1Node 2Node 3

最后,我们通过 plt.axis('off') 命令关闭了坐标轴,使绘图更美观。上面的代码将绘制以下图形:

graph