我想创建一个多层图(如所附的图像),通过使用networkx
连接用以下代码编写的两个图
#Graph1
g1 = nx.read_edgelist('sample.txt', nodetype=str)
pos = nx.shell_layout(g)
plt.figure(figsize=(10, 10))
nx.draw_networkx_edges(g, pos, edge_color='khaki', alpha=1)
nx.draw_networkx_nodes(g,pos,node_color='r',alpha=0.5,node_size=1000)
nx.draw_networkx_labels(g, pos, font_size=10,font_family='IPAexGothic')
plt.axis('off')
#Graph2
g2 = nx.read_edgelist('sample2.txt', nodetype=str)
pos = nx.shell_layout(g)
plt.figure(figsize=(10, 10))
nx.draw_networkx_edges(g, pos, edge_color='khaki', alpha=1)
nx.draw_networkx_nodes(g,pos,node_color='r',alpha=0.5,node_size=1000)
nx.draw_networkx_labels(g, pos, font_size=10,font_family='IPAexGothic')
plt.axis('off')
2条答案
按热度按时间b5buobof1#
networkx
中目前没有支持分层布局的功能,更不用说如图所示的可视化了。所以我们得自己卷。下面的实现
LayeredNetworkGraph
假设您有一个表示不同层的图表列表[g1, g2, ..., gn]
。在层内,对应的(子)图定义连通性。在层之间,如果后续层中的节点具有相同的节点ID,则它们被连接。由于没有布局函数(AFAIK)可以计算三维中的节点位置,并对层内的节点施加平面度约束,因此我们使用了一个小技巧:我们创建跨所有层的图形合成,计算二维中的位置,然后将这些位置应用于所有层中的节点。人们可以用平面度约束计算一个真正的力导向布局,但这将是大量的工作,因为你的例子只使用了一个shell布局(这将不受影响),我没有打扰。在许多情况下,差异很小。
如果你想改变可视化的各个方面(大小、宽度、颜色),可以看看
draw
方法。您可能需要的大多数更改都可以在那里进行。ryhaxcpt2#
上述解决方案在最新的networkx上对我不起作用。I created a gist that provides a flat networkx-ified version。