通过networkx着色节点

时间:2019-01-29 02:23:31

标签: python-3.x csv networkx topology

我正在通过csv文件中的数据生成网络拓扑图,其中s0..s2和c1..c3是该图的节点。

network.csv:

  

源,端口,目的地

     

s1,1,c3

     

s2,1,c1

     

s0,1,c2

     

s1,2,s2

     

s2,2,s0

我需要将所有来源设置为蓝色,将目的地设置为绿色。 如何在不覆盖源节点的情况下做到这一点?

1 个答案:

答案 0 :(得分:0)

以下是可行的解决方案:

import csv
import networkx as nx
from matplotlib import pyplot as plt

with open('../resources/network.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    edges = {(row['source'], row['destination']) for row in reader }
print(edges) # {('s1', 'c3'), ('s1', 's2'), ('s0', 'c2'), ('s2', 's0'), ('s2', 'c1')}

G = nx.DiGraph()
source_nodes = set([edge[0] for edge in edges])
G.add_edges_from(edges)
for n in G.nodes():
    G.nodes[n]['color'] = 'b' if n in source_nodes else 'g'

pos = nx.spring_layout(G)
colors = [node[1]['color'] for node in G.nodes(data=True)]
nx.draw_networkx(G, pos, with_labels=True, node_color=colors)
plt.show()

我们首先将csv读取到边缘列表,该边缘列表随后用于G的构造。为了很好地定义颜色,我们将每个源节点设置为蓝色,将其余节点设置为绿色 (即,也不是源节点的所有目标节点)。

我们还使用nx.draw_networkx获得用于绘制图形的更紧凑的实现。

结果应该类似于:

enter image description here