Python 3.x 通过networkx为节点着色

Python 3.x 通过networkx为节点着色,python-3.x,csv,networkx,topology,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 我需要使所有的来源是蓝色和目的地是绿色的。 如何在不覆盖源节点的情况下执行此操作?以下是一个可行的解决方案: import csv import networkx as nx from matplotlib import pyplot as plt with open('../reso

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

network.csv:

源、端口、目的地

s1,1,c3

s2,1,c1

s0,1,c2

s1,2,s2

s2,2,s0

我需要使所有的来源是蓝色和目的地是绿色的。
如何在不覆盖源节点的情况下执行此操作?

以下是一个可行的解决方案:

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\u networkx来获得更紧凑的图形绘制实现

结果应该是:


以下是一个可行的解决方案:

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\u networkx来获得更紧凑的图形绘制实现

结果应该是:


非常感谢你的帮助。但有时我会得到一个源节点作为greens2。我有一个程序,每次运行主程序diff python文件时,csv中都有新的连接。因此,有时当我运行这段代码时,我会得到一个很乐意提供帮助的源节点:很难说为什么没有实际的代码和数据它会发生。可能边/源节点不是您认为的那样。尝试打印它们并复制这样的场景。值得一提的是,csv部分与绘图部分完全无关,我猜问题在于读取csv。现在我在目标中又多了一个节点,即M0,您能告诉我如何给它一个不同于其他两个节点的颜色吗?我如何从端口号添加csv的边缘权重?示例:S11、S21等的边缘?很抱歉,我认为如果a生成一个新问题,您可能不会注意到。非常感谢您的帮助。但有时我会得到一个源节点作为greens2。我有一个程序,每次运行主程序diff python文件时,csv中都有新的连接。因此,有时当我运行这段代码时,我会得到一个很乐意提供帮助的源节点:很难说为什么没有实际的代码和数据它会发生。可能边/源节点不是您认为的那样。尝试打印它们并复制这样的场景。值得一提的是,csv部分与绘图部分完全无关,我猜问题在于读取csv。现在我在目标中又多了一个节点,即M0,您能告诉我如何给它一个不同于其他两个节点的颜色吗?我如何从端口号添加csv的边缘权重?示例:S11、S21等的边缘?很抱歉,我认为如果a生成一个新问题,您可能不会注意到。