2017-02-16 25 views
0

У меня есть график, который делится на уровни, то есть f.e. :NetworkX: рисовать график в слоях

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

Есть ли способ заставить граф рисовать узлы уровней, расположенных в слоях, один над другим.

Я хочу, чтобы сложить их без перелива :)

В моем случае, в котором слой узел зависит от узла-ид, но это может быть какой-то другой принцип организации, если у вас есть какое-то представление.


Это до сих пор кажется, что возможное решение: например

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

+0

Не могли бы вы опубликовать пример изображения с желаемым результатом? – edo

ответ

1

функции компоновки, такие как nx.spring_layout, возвращают Dict, ключи являются узлами и значениями которых являются 2-кортежи (координаты). Вот пример того, что 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])} 

Вы можете управлять эти координаты дальше, любой путь вы пожалуйста. Например, так как в x и y координате возвращаемый spring_layout находится между 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