【问题标题】:How to choose root node in "dot" graph layout for plotting with networkx and pydot/pygraphviz如何在“点”图形布局中选择根节点以使用 networkx 和 pydot/pygraphviz 进行绘图
【发布时间】:2021-02-28 20:27:34
【问题描述】:

我正在尝试使用 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。
我如何决定哪个节点被选为第一个/顶部?
使用其他 prog 选项,例如“twopi”,它确实会对我设置为 root 的内容做出反应。

【问题讨论】:

    标签: python networkx graph-theory graphviz pydot


    【解决方案1】:

    如果 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()
    

    【讨论】:

    • 太棒了!我正在查看一些程序,您确实可以在其中添加要插入节点的位置,但nx.draw() 在 x 和 y 轴上的任何位置绘制。即使我们使用 x_lim() 和 y_lim() 限制轴,节点也会消失!我仍然不相信没有人根据他们的喜好制作任何功能来可视化节点。也许这是由于图表的性质只显示节点之间的关系,这就是为什么它们在任何空间地图上都可视化。
    【解决方案2】:

    注意: Networkx 可视化总是向节点返回一个随机图。

    仅仅因为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等高密度可视化库集成,因此无法确定每个节点的方向。

    【讨论】:

    • 非常感谢,但我的意图是确定方向,因为对于更大的图表,它不足以为根着色。您是否知道任何其他允许我这样做的库/工具?
    猜你喜欢
    • 2017-12-23
    • 2019-04-13
    • 2023-04-05
    • 1970-01-01
    • 2011-06-24
    • 2023-01-30
    • 1970-01-01
    • 2014-03-25
    • 2015-03-08
    相关资源
    最近更新 更多