在NetworkX中将图分成3部分绘制

2 投票
2 回答
929 浏览
提问于 2025-04-17 23:38

我在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)

你知道有没有更聪明的方法来按照我想要的方式定位图的节点吗?

附注:我希望的输出大致是这样的:

enter image description here

我不需要画出分隔层级的线条,我只是放上去让大家更清楚我需要什么。

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

enter image description here

撰写回答