在NetworkX中将图分成3部分绘制
我在Networkx中有一个图,里面包含不同的信息。这个图的节点看起来是这样的:
G = nx.DiGraph()
G.add_node(shape1, level=1)
G.add_node(shape2, level=2)
G.add_node(shape3, level=2)
G.add_node(shape4, level=3)
...
我想绘制这个图,使得所有在第一层的形状都在图的顶部,第三层的形状在底部,而第二层的形状则在中间。最多有三层。
我一直在阅读NetworkX的文档,但到目前为止,我只用过这种随机的节点位置:
pos = nx.spring_layout(G)
nx.draw(G, pos)
。
你知道有没有更聪明的方法来按照我想要的方式定位图的节点吗?
附注:我希望的输出大致是这样的:

我不需要画出分隔层级的线条,我只是放上去让大家更清楚我需要什么。
2 个回答
0
这是关于NetworkX 2.6.2的更新回答:
pos = nx.nx_pydot.graphviz_layout(G, prog="dot")
nx.draw(G, pos=pos, with_labels=True, font_weight='bold')
plt.show()
(确保你已经安装了pydot
这个库)
5
这个“dot”布局提供了一个接口,可以和graphviz一起使用,似乎正好符合你的需求。虽然它能处理你提供的这个简单图形,但如果是更大更复杂的图形,你可能需要对输出结果进行一些调整。
import networkx as nx
G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)
G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)
import pylab as plt
nx.draw_graphviz(G, node_size=1600, cmap=plt.cm.Blues,
node_color=range(len(G)),
prog='dot')
plt.show()