如何在 "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()
我正在尝试使用 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()