📅  最后修改于: 2023-12-03 15:36:32.218000             🧑  作者: Mango
在上一篇文章中,我们已经介绍了如何使用 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
属性,其值分别为 red
和 blue
。我们通过 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_nodes
和 nx.draw_networkx_edges
绘制节点和边。节点的颜色由其 color
属性决定,边的颜色由其 weight
属性决定。
我们还使用了 nx.draw_networkx_labels
绘制节点的标签。节点的标签由字典 node_labels
决定,其中键为节点标识符,值为节点的标签。在本例中,节点的标签为 Node 1
,Node 2
和 Node 3
。
最后,我们通过 plt.axis('off')
命令关闭了坐标轴,使绘图更美观。上面的代码将绘制以下图形: