在SPYDER中绘制有向图的Python代码

5

我正在使用SPYDER。我有以下代码。该代码生成图表。但是图表不够清晰。我想在图表中看到层次结构-我的第一层有“start”节点,第二层有1、2、3节点,第三层有“a”、“b”、“c”节点,最后一层有“end”节点。有什么办法可以实现我的目标吗?

import networkx as nx
import matplotlib.pyplot as plt
import os.path as path

G=nx.DiGraph()
G.add_nodes_from(['start',1,2,3,'a','b','c','end'])

G.nodes(data=True)

G.add_edge('start',2)
G.add_edge('start',3)
G.add_edge(2,'b')
G.add_edge('b','end')
G.add_edge('a','end')
G.add_edge('f','g')
nx.draw(G)

我理解为“分层”是指像附图所示的网络结构。我想要以这种方式绘制网络,因为层X中的节点仅与层X + 1或层X-1中的节点直接连接。

你能否再解释一下你在绘图中所说的“层”是什么意思? - Aric
1
这个问题似乎与以下问题相关(如果不是完全重复):https://dev59.com/r2gu5IYBdhLWcg3wOUq- - John Y
我在我的答案中使用了这个,可能更接近。我想这实际上是一个重复的内容。 - KobeJohn
2个回答

5
似乎networkx对于安排图形没有提供太多帮助,但我只接触过几次,不能确定。我找不到实现你所要求的方法的途径。
然而,我尝试使用graphviz(必须先安装)来完成它。排名方法的信用归功于这个SO答案

复制-粘贴示例

import networkx as nx

ranked_node_names = [['start'],
                     [1, 2, 3],
                     ['a', 'b', 'c'],
                     ['end']]
node_edges = [('start', 2),
              ('start', 3),
              (2, 'b'),
              ('b', 'end'),
              ('a', 'end')]

# graph and base nodes/edges in networkx
G = nx.DiGraph()
for rank_of_nodes in ranked_node_names:
    G.add_nodes_from(rank_of_nodes)
G.nodes(data=True)
G.add_edges_from(node_edges)
# I don't know a way to automatically arrange in networkx so using graphviz
A = nx.to_agraph(G)
A.graph_attr.update(rankdir='LR')  # change direction of the layout
for rank_of_nodes in ranked_node_names:
    A.add_subgraph(rank_of_nodes, rank='same')
# draw
A.draw('example.png', prog='dot')

默认输出

enter image description here

LR(左右)输出

enter image description here


由于我正在使用Windows系统并遇到安装pygraphviz和graphviz的问题,无法测试您的解决方案。我已经在stackoverflow上发布了一个新问题:https://dev59.com/m37aa4cB1Zd3GeqPmSOR 如果我成功安装了Graphviz,则会测试您的解决方案并支付赏金。 - user2543622
@user2543622 我也用的是Windows系统。安装后只需将/bin文件夹添加到路径中即可。我想这可能是我需要执行的唯一额外步骤。您在安装/运行代码时遇到了什么问题? - KobeJohn
我能够使用链接-http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygraphviz安装pygraphviz。但是现在当我运行代码的最后一行时,会出现一个错误,指出“raise ValueError("Program %s not found in path."%prog) ValueError: Program nop not found in path." - user2543622
如果您将bin文件夹添加到路径中,该问题应该就解决了。我之前也遇到过同样的问题。 - KobeJohn
我是 Python 的新手。我的学习路线应该是什么样的,应该将它添加到哪里? - user2543622
@user2543622,路径基本上告诉你的计算机在哪里查找东西。目前networkx正在尝试使用graphviz,但是找不到你所写的nop。请查看此教程,了解如何编辑您的路径。您需要按照教程中所示添加graphviz二进制文件夹。如果您使用默认设置,则可能需要添加以下内容:C:\Program Files (x86)\Graphviz2.36\bin。或者,您可以使用此工具将文件夹添加到您的路径中。 - KobeJohn

2
您至少有两个选项:如果您愿意,可以自己创建一个带有节点位置的字典。首先将节点分配到不同层,然后:
position = dict()
for (i, layer) in enumerate(layers):
    for (j, node) in enumerate(layer):
        position[node] = (i, j / float(len(layer))

然后,您可以使用给定的节点位置绘制网络,代码为nx.draw(G, pos=position)

另一种选择是使用graphviz和Python中的AGraph类,可用于生成分层布局。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接