使用Python中的matplotlib和networkx库来绘制一个有向图,并显示边的权重标签。
1. 定义了节点和边:节点是一个包含5个节点的列表,边是一个包含各个边以及它们的权重的列表。
2. 创建了一个有向图对象 `G`。
3. 向图中添加节点和边。
4. 设置了节点的布局,这里使用了Spring布局,它会尽可能地使得节点间的边长相等,并保持节点间的相对位置,`k`参数是一个布局调整参数。
5. 使用 `nx.draw()` 函数绘制了有向图,其中 `pos` 是节点的位置,`with_labels=True` 表示显示节点标签,`node_size` 控制节点的大小,`node_color` 是节点的颜色,`font_size` 是标签的字体大小,`arrows=True` 表示显示边的方向。
6. 添加了边的权重标签,用以显示每条边的权重。利用 `nx.draw_networkx_edge_labels()` 函数,将权重标签添加到相应的边上,并设置了标签的颜色和位置。
7. 最后使用 `plt.show()` 函数显示绘制好的有向图。
这段代码的核心是使用了 `networkx` 库来创建和操作图形数据结构,并使用 `matplotlib` 库来进行图形绘制。
import matplotlib.pyplot as plt
import networkx as nx
# 节点和边
nodes = [0, 1, 2, 3, 4]
edges = [
(0, 1, {'weight': 10}), (0, 3, {'weight': 5}), (1, 2, {'weight': 1}), (1, 3, {'weight': 2}),
(2, 4, {'weight': 4}), (3, 1, {'weight': 3}), (3, 2, {'weight': 9}), (3, 4, {'weight': 2}),
(4, 0, {'weight': 7}), (4, 2, {'weight': 6})
]
# 创建有向图
G = nx.DiGraph()
# 添加节点和边
G.add_nodes_from(nodes)
G.add_edges_from(edges)
# 设置布局
pos = nx.spring_layout(G, k=0.5)
# 绘制有向图,确保显示边的方向
nx.draw(G, pos, with_labels=True, node_size=700, node_color="lightblue", font_size=12, arrows=True)
# 添加权重标签
edge_labels = {}
for u, v, data in G.edges(data=True):
weight = data['weight']
edge_labels[(u, v)] = f"{u}->{v}:{weight}" # 将节点和权重标签放在一起显示
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='black', label_pos=0.3)
plt.show()