如何在 "dot" 图形布局中选择根节点以使用 networkx 和 pydot/pygraphviz 进行绘图

How to choose root node in "dot" graph layout for plotting with networkx and pydot/pygraphviz

我正在尝试使用 networkx 为树图创建可视化。
如何选择根节点?即从顶部开始的第一个。
运行 此代码:

import networkx as nx
import pydot
import matplotlib.pyplot as plt
from networkx.drawing.nx_pydot import *

G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,4)
G.add_edge(4,5)
G.add_edge(4,6)
G.add_edge(5,7)

pos = pydot_layout(G, prog="dot", root=4)
nx.draw(G, pos, with_labels=True)
plt.show()

给出这个输出:

请注意,我使用 root=4 创建布局,但图片中的根仍然是节点 1。
我如何决定选择哪个节点作为 first/top 节点?
对于其他 prog 选项,例如“twopi”,它确实会对我设置为 root 的内容做出反应。

注意: Networkx 可视化总是 returns 随机绘制节点。

仅仅因为 node 1 出现在图表的顶部 并不意味着 它是根节点!由于您可能正在使用 PyCharm(或任何编辑器),情况可能是每次您 运行 您的脚本时,它都会存储一些缓存以便您可以获得相同的输出,但我向您保证节点可视化已创建在旅途中。

既然要区分根节点和其他节点,建议使用nx.draw()node_color参数。

为每个节点创建一个颜色列表并将其传递给node_color

这里是您可以使用的完整修改代码:-

G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,4)
G.add_edge(4,5)
G.add_edge(4,6)
G.add_edge(5,7)    

pos = pydot_layout(G, prog="dot", root=4)

colors = []
for node in G:
    if node == 4:
        colors.append('red')
    else: 
        colors.append('blue')
  
pos = pydot_layout(G, prog="dot", root=4)
nx.draw(G, pos,node_color=colos,with_labels=True)
plt.show()

不幸的是,由于 networkx 可视化与 seaborn 和 matplotlib 等高度密集的可视化库集成,因此无法确定每个节点的方向。

如果G是一棵树,我找到了解决方案。创建一个辅助(有向/nx.DiGraph)图,其中每条边 (v,w) 的方向由从根开始的 BFS 中探索 v 和 w 的顺序确定。
然后从有向图 aux_G 中获取布局 pos 并用它绘制 G

aux_G = my_func_directed_bfs(G, root=4)

pos = pydot_layout(aux_G , prog="dot")
nx.draw(G, pos, with_labels=True)
plt.show()