我正在使用SPYDER。我有以下代码。代码生成图形。但图表不干净。我想在图中看到图层 - 我的第一层有'开始'节点,第二层有1,2,3节点,第三层有'a','b','c'节点,最后一层有'结束'节点。任何想法我怎么能实现我的目标?
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中的节点
答案 0 :(得分:5)
它[似乎networkx does not provide much for arranging graphs但我只触及了几次,所以我无法肯定地说。我找不到办法去做你想问的事。
但是,我尝试使用graphviz
(必须先安装)来完成它。排名方法的积分转到this SO answer。
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')
答案 1 :(得分: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
类,它可用于生成分层布局。