为字典创建的NetworkX图的节点与边添加并展示capacity属性
为NetworkX图的节点和边分配并展示Capacity属性
步骤1:为节点和边添加Capacity属性
你可以在创建节点/边时直接指定属性,也可以在图创建完成后批量赋值。以下是具体实现方式:
为节点添加Capacity属性
先定义每个节点的容量值,再在添加节点时附带属性:
# VNF图节点容量 node_capacities_f = { 'VNF1': 10, 'VNF2': 20, 'VNF3': 15, 'VNF4': 25, 'VNF5': 18 } # 服务器图节点容量 node_capacities_s = { 'S1': 50, 'S2': 60, 'S3': 45, 'S4': 70, 'S5': 55 } # 创建图并添加带属性的节点 graph1 = nx.DiGraph() graph1.add_nodes_from([(node, {'capacity': node_capacities_f[node]}) for node in Nf]) graph2 = nx.Graph() graph2.add_nodes_from([(node, {'capacity': node_capacities_s[node]}) for node in Ns])
为边添加Capacity属性
同样先定义边的容量,再添加带属性的边:
# VNF图边容量 edge_capacities_f = { ('VNF1', 'VNF2'): 5, ('VNF2', 'VNF3'): 8, ('VNF3', 'VNF4'): 6, ('VNF2', 'VNF5'): 7, ('VNF5', 'VNF3'): 9 } # 服务器图边容量 edge_capacities_s = { ('S1', 'S2'): 10, ('S1', 'S4'): 12, ('S2', 'S4'): 9, ('S2', 'S3'): 11, ('S4', 'S3'): 8, ('S4', 'S5'): 13, ('S3', 'S5'): 10 } # 添加带容量属性的边 graph1.add_edges_from([(u, v, {'capacity': edge_capacities_f[(u, v)]}) for u, v in Lf]) graph2.add_edges_from([(u, v, {'capacity': edge_capacities_s[(u, v)]}) for u, v in Ls]) # 为S1-S2边同时设置weight和capacity属性 graph2.add_edge("S1", "S2", weight=4.7, capacity=edge_capacities_s[('S1', 'S2')])
步骤2:在可视化中展示Capacity属性
修改节点标签以包含容量信息,添加边标签展示边的容量:
fig1, ax1 = plt.subplots(figsize=(7, 7)) # 绘制VNF图节点及带容量的标签 nx.draw_networkx_nodes(graph1, pos=pos1, ax=ax1, edgecolors='black', node_size=1100) node_labels_f = {node: f"{node}\nCap: {graph1.nodes[node]['capacity']}" for node in graph1.nodes} nx.draw_networkx_labels(graph1, pos=pos1, ax=ax1, labels=node_labels_f, font_size=7) # 绘制VNF图边及容量标签 nx.draw_networkx_edges(graph1, pos=pos1, ax=ax1, node_size=900, arrowsize=25) edge_labels_f = {(u, v): graph1.edges[u, v]['capacity'] for u, v in graph1.edges} nx.draw_networkx_edge_labels(graph1, pos=pos1, ax=ax1, edge_labels=edge_labels_f, font_size=6) # 绘制服务器图节点及带容量的标签 nx.draw_networkx_nodes(graph2, pos=pos, ax=ax1, edgecolors='black', node_size=800) node_labels_s = {node: f"{node}\nCap: {graph2.nodes[node]['capacity']}" for node in graph2.nodes} nx.draw_networkx_labels(graph2, pos=pos, ax=ax1, labels=node_labels_s, font_size=8) # 绘制服务器图边及容量标签 nx.draw_networkx_edges(graph2, pos=pos, ax=ax1, node_size=900, arrowsize=25) edge_labels_s = {(u, v): graph2.edges[u, v]['capacity'] for u, v in graph2.edges} nx.draw_networkx_edge_labels(graph2, pos=pos, ax=ax1, edge_labels=edge_labels_s, font_size=6) plt.axis('on') plt.show()
完整代码示例
整合所有步骤的完整可运行代码:
import networkx as nx import matplotlib.pyplot as plt # VNFGraph Nf = {'VNF1', 'VNF2', 'VNF3', 'VNF4', 'VNF5'} Lf = {('VNF1', 'VNF2'),('VNF2', 'VNF3'),('VNF3', 'VNF4'), ('VNF2', 'VNF5'),('VNF5', 'VNF3')} # SERVERGraph Ns = {'S1', 'S2', 'S3', 'S4', 'S5'} Ls = {('S1', 'S2'),('S1', 'S4'),('S2', 'S4'),('S2', 'S3'),('S4', 'S3'),('S4', 'S5'),('S3', 'S5')} # 定义节点容量 node_capacities_f = {'VNF1':10, 'VNF2':20, 'VNF3':15, 'VNF4':25, 'VNF5':18} node_capacities_s = {'S1':50, 'S2':60, 'S3':45, 'S4':70, 'S5':55} # 定义边容量 edge_capacities_f = { ('VNF1','VNF2'):5, ('VNF2','VNF3'):8, ('VNF3','VNF4'):6, ('VNF2','VNF5'):7, ('VNF5','VNF3'):9 } edge_capacities_s = { ('S1','S2'):10, ('S1','S4'):12, ('S2','S4'):9, ('S2','S3'):11, ('S4','S3'):8, ('S4','S5'):13, ('S3','S5'):10 } # 创建图并添加带属性的节点和边 graph1 = nx.DiGraph() graph1.add_nodes_from([(n, {'capacity': node_capacities_f[n]}) for n in Nf]) graph1.add_edges_from([(u, v, {'capacity': edge_capacities_f[(u, v)]}) for u, v in Lf]) graph2 = nx.Graph() graph2.add_nodes_from([(n, {'capacity': node_capacities_s[n]}) for n in Ns]) graph2.add_edges_from([(u, v, {'capacity': edge_capacities_s[(u, v)]}) for u, v in Ls]) graph2.add_edge("S1", "S2", weight=4.7, capacity=edge_capacities_s[('S1','S2')]) # 位置定义 pos1 = {'VNF1': (0,6), 'VNF2':(2,6), 'VNF3':(4,6), 'VNF4':(6,6), 'VNF5':(3,4)} pos = {'S1':(0,1), 'S2':(2,2), 'S3':(4,2), 'S4':(3,1), 'S5':(6,1)} # 可视化 fig1, ax1 = plt.subplots(figsize=(7,7)) # VNF图绘制 nx.draw_networkx_nodes(graph1, pos=pos1, ax=ax1, edgecolors='black', node_size=1100) node_labels_f = {n: f"{n}\nCap: {graph1.nodes[n]['capacity']}" for n in graph1.nodes} nx.draw_networkx_labels(graph1, pos=pos1, ax=ax1, labels=node_labels_f, font_size=7) nx.draw_networkx_edges(graph1, pos=pos1, ax=ax1, node_size=900, arrowsize=25) edge_labels_f = {(u,v): graph1.edges[u,v]['capacity'] for u,v in graph1.edges} nx.draw_networkx_edge_labels(graph1, pos=pos1, ax=ax1, edge_labels=edge_labels_f, font_size=6) # 服务器图绘制 nx.draw_networkx_nodes(graph2, pos=pos, ax=ax1, edgecolors='black', node_size=800) node_labels_s = {n: f"{n}\nCap: {graph2.nodes[n]['capacity']}" for n in graph2.nodes} nx.draw_networkx_labels(graph2, pos=pos, ax=ax1, labels=node_labels_s, font_size=8) nx.draw_networkx_edges(graph2, pos=pos, ax=ax1, node_size=900, arrowsize=25) edge_labels_s = {(u,v): graph2.edges[u,v]['capacity'] for u,v in graph2.edges} nx.draw_networkx_edge_labels(graph2, pos=pos, ax=ax1, edge_labels=edge_labels_s, font_size=6) plt.axis('on') plt.show()
内容的提问来源于stack exchange,提问作者Waqas Swati
相关产品推荐
相关产品推荐

