簡體   English   中英

NetworkX:按層繪制圖形

[英]NetworkX: draw graph in layers

我有一個按級別划分的圖表 iefe :

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

五層示例...

在此處輸入圖片說明

布局函數,例如nx.spring_layout ,返回一個字典,其鍵是節點,其值是 2 元組(坐標)。 下面是pos dict 的示例:

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

產生在此處輸入圖片說明

你考慮過https://github.com/SkBlaz/Py3Plex嗎? 它對多層網絡有適當的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM