TL/DR:只需执行以下操作:
pos = nx.spring_layout(g)
h = g.subgraph(A)
nx.draw_networkx_nodes(h,pos=pos, node_color='b') #or even nx.draw(h,pos=pos,node_color='b') to get nodes and edges in one command
nx.draw_networkx_edges(h,pos=pos)
完整答案:
您只想绘制A
中的节点和路径中的边缘。实际上,您可以完全避免使用noCor
,使用指定要绘制哪些节点的nodelist
参数即可。
nx.draw_networkx_nodes(g,pos=pos, nodelist = A, node_color = 'b')
要仅绘制与
A
对应的边缘,您需要找出这些边缘是什么。我所知道的最简单的方法是:
h = g.subgraph(A)
那么h
是在节点A
上诱导的子图。它包含A
中所有的边。我有99.9%的把握(但没有通过正式证明进行验证),如果A
是两个节点之间的最短路径(如Dijkstra返回的),则除了路径中的边之外,A
中的节点之间就没有其他边。因此,h.edges()
将给出A
的边。
nx.draw_networkx_edges(g,pos=pos, edgelist = h.edges())
更紧凑的形式可以这样写:
pos = nx.spring_layout(g)
h = g.subgraph(A)
nx.draw_networkx_nodes(h,pos=pos, node_color='b') #or even nx.draw(h,pos=pos,node_color='b') to get nodes and edges in one command
nx.draw_networkx_edges(h,pos=pos)
您可能会问为什么我是以
g
为基础定义了
pos
,而不是以
h
为基础。这是因为您可能希望稍后在您的图中或其他图中绘制一些其他节点,并且具有一致的位置是有用的。如果您只是以
h
为基础进行操作,它基本上会创建一条直线。
关于您的命令
nx.draw_networkx_nodes(g, pos=pos, node_color=noCor)
的一些注释。这告诉它使用来自
noCor
的颜色绘制
g
中的所有节点 [它将根据颜色在
noCor
中出现的顺序以及节点在
g.nodes()
中出现的顺序对节点进行着色]。最后,请注意您需要使用 matplotlib 可识别的颜色(请参见
http://matplotlib.org/api/colors_api.html)。在这种情况下:
noCor = ["b" if n in A else "r" for n in g.nodes()]