[英]NetworkX: draw graph in layers
I have a graph which is divided on levels iefe :我有一个按级别划分的图表 iefe :
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 :)我想在没有溢出的情况下堆叠它们:)
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.在我的情况下,节点所在的层取决于节点 ID,但如果您有一些想法,它可能是其他一些组织原则。
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')
Five layers example ...五层示例...
The layout functions, such as nx.spring_layout
, return a dict whose keys are nodes and whose values are 2-tuples (coordinates).布局函数,例如
nx.spring_layout
,返回一个字典,其键是节点,其值是 2 元组(坐标)。 Here is an example of what the pos
dict might look like:下面是
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])}
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:例如,由于
spring_layout
返回的x
和y
坐标在 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()
您可以使用这个pymnet
库http://www.mkivela.com/pymnet/visualizing.html或multinetx
库https://github.com/nkoub/multinetx
Have you considered https://github.com/SkBlaz/Py3Plex ?你考虑过https://github.com/SkBlaz/Py3Plex吗? It has proper support for multilayer networks.
它对多层网络有适当的支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.