gpt4 book ai didi

python - NetworkX:分层绘制图形

转载 作者:行者123 更新时间:2023-12-02 15:12:56 46 4
gpt4 key购买 nike

我有一个按级别划分的图表,即 f.e. :

ids : 0 - 100 are lowest level
ids : 101 - 500 are level 2
ids : 501 - 1500 are level 3
and so on ...

是否有某种方法可以强制图形在分层组织的级别中绘制节点,一个在另一个之上。

我想把它们堆叠起来而不会溢出 :)

在我的例子中,节点所在的层取决于节点 ID,但如果您有一些想法,它可能是其他一些组织原则。


到目前为止,这似乎是可能的解决方案:

def plot(self):
plt.figure()
pos = nx.graphviz_layout(self.g,prog='dot')
nx.draw(self.g, pos, node_size=650, node_color='#ffaaaa')

五层示例...

enter image description here

最佳答案

布局函数,例如nx.spring_layout,返回一个字典,它的键是节点,值是二元组(坐标)。以下是 pos 字典的示例:

In [101]: pos
Out[101]:
{(0, 0): array([ 0.70821816, 0.03766149]),
(0, 1): array([ 0.97041253, 0.30382541]),
(0, 2): array([ 0.99647583, 0.63049339]),
(0, 3): array([ 0.86691957, 0.86393669]),
(1, 0): array([ 0.79471631, 0.08748146]),
(1, 1): array([ 0.71731384, 0.35520076]),
(1, 2): array([ 0.69295087, 0.71089292]),
(1, 3): array([ 0.63927851, 1. ]),
(2, 0): array([ 0.42228877, 0. ]),
(2, 1): array([ 0.33250362, 0.3165331 ]),
(2, 2): array([ 0.31084694, 0.69246818]),
(2, 3): array([ 0.34141212, 0.9952164 ]),
(3, 0): array([ 0.16734454, 0.11357547]),
(3, 1): array([ 0.01560951, 0.33063389]),
(3, 2): array([ 0. , 0.63044189]),
(3, 3): array([ 0.12242227, 0.85656669])}

然后您可以随心所欲地进一步操纵这些坐标。例如,因为spring_layout返回的xy坐标在0到1之间,你可以将层级值的 10 倍添加到 y 坐标以将节点分成层:

for node in pos:
level = node // nodes_per_layer
pos[node] += (0,10*level)

import networkx as nx
import matplotlib.pyplot as plt

layers = 5
nodes_per_layer = 3
n = layers * nodes_per_layer
p = 0.2

G = nx.fast_gnp_random_graph(n, p, seed=2017, directed=True)
pos = nx.spring_layout(G, iterations=100)

for node in pos:
level = node // nodes_per_layer
pos[node] += (0,10*level)

nx.draw(G, pos, node_size=650, node_color='#ffaaaa', with_labels=True)
plt.show()

生产 enter image description here

关于python - NetworkX:分层绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286858/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com