NetworkX:分层绘制图形 [英] NetworkX: draw graph in layers

查看:412
本文介绍了NetworkX:分层绘制图形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个图表,该图表分为多个级别,即:

I have a graph which is divided on levels i.e. f.e. :

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

是否有某种方法可以迫使图形在分层组织的层级中绘制节点,一个层次又一个层次.

Is there some way to force the graph to draw the nodes in the levels organized in layers, one above the other.

我要堆叠它们而不会溢出:)

I want to stack them without overflow :)

在我的情况下,节点位于哪一层取决于node-id,但是如果您有任何想法,也可以是其他一些组织原则.

In my case in which layer the node is depends on the node-id, but it could be some other organizational principle, if you have some idea.

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

This so far seems like possible solution :

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)返回一个dict,其键为节点,其值为2元组(坐标).以下是pos字典可能的示例:

The layout functions, such as nx.spring_layout, return a dict whose keys are nodes and whose values are 2-tuples (coordinates). Here is an example of what the pos dict might look like:

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之间,您可以 可以将y坐标的层级别值增加10倍,以将节点分为几层:

You can then manipulate these coordinates further, any way you please. For example, since the x and y coordinates returned by spring_layout are between 0 and 1, you could add 10 times the layer level value to the y-coordinate to separate the nodes into layers:

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

产生

这篇关于NetworkX:分层绘制图形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆