如何在NetworkX或igraph中处理多部图?

3
我正在处理多部分网络,特别是四部分网络。首先,在NetworkX中似乎只能通过nx.complete_multipartite_graph()处理完整的多部分网络,而不能处理更一般的多部分网络(如果我错了,请纠正我)。如果需要,我可以开始查看igraph或另一个Python包。
James A. Foster's question的启发,我创建了一个类似于我的网络的绘图,当然规模要小一些,并且具有一些特征。我仅使用此代码以图形方式查看它,并作为帮助来解释我想做什么。
我使用以下命名法: 第一和第二列形成“X二分网络”, 第二和第三列形成“Y二分网络”, 第三和第四列形成“Z二分网络”, 我有所有这些网络在单独的文件中。我想将它们集成到一个多部分网络中,如下图所示:Quadripartite graph
(1) 我应该如何进行?据我所知,我不能使用nx.compose()函数。
(2) 我该怎么办?我需要指定两列是不同的,尽管它们具有相同的元素。
(3) 我如何提取第一列和第四列之间的网络?在这个小网络中,例如,节点6与11和14相连,节点11当然与1、2和6相连。
import networkx as nx
import matplotlib.pyplot as plt

def position_QuadriPartiteGraph(Graph, Parts):
uPos = {}
vPos = {}
for index1, agentType in enumerate(Parts):
    uPos[agentType] = index1

QG = nx.Graph()
QG.add_nodes_from([1,2,3,4,5,6,7], agentType='alfa')
QG.add_nodes_from(['a','b','c'], agentType='beta')
QG.add_nodes_from(['A','B','C','D','E','F'], agentType='gamma')
QG.add_nodes_from([8,9,10,11,12,13,14], agentType='delta')

myEdges = [(1,'a'), # beginning of bipartite network X
           (1,'b'), # X
           (2,'b'), # X
           (3,'a'), # X
           (4,'a'), # X
           (5,'a'), # X
           (6,'c'), # X
           (7,'a'), # end of bipartite network X
           ('a','A'), # beginning of bipartite network Y
           ('a','B'), # Y
           ('a','E'), # Y
           ('b','B'), # Y
           ('b','C'), # Y
           ('b','D'), # Y
           ('c','F'), # end of bipartite network Y
           ('A',8), # beginning of bipartite network Z
           ('A',9), # Z
           ('B',9), # Z
           ('B',13), # Z
           ('C',10), # Z
           ('C',11), # Z
           ('C',12), # Z
           ('D',12), # Z
           ('E',13), # Z
           ('F', 11), # Z
           ('F', 14)] # end of bipartite network Z

[QG.add_edge(u, v) for u, v in myEdges]

nx.draw(QG, pos=position_QuadriPartiteGraph(QG, ['alfa', 'beta', 'gamma', 'delta']), with_labels=True)
plt.savefig("multipartite_graph.png")
plt.show()

提前感谢您的帮助,

Jorge

1个回答

1
我的第一个建议是将三个网络分别命名为g1g2g3。同时,通过使g3标签与g1标签不同(比如说取负数),解决问题(2)。然后,你可以通过逐步查看g2中g1代理的邻居、g3中g2代理的邻居等来解决问题(3)。
edges14 = sum([sum([[(i,y) for y in g3.neighbors(x)] 
              for x in sum([g2.neighbors(x) for x in g1.neighbors(i) if x in g2],
                           []) if x in g3],
                    []) for i in g1],
               [])
set(edges14)
# {(5, -9), (4, -8), (5, -13), (2, -12), (1, -11), (5, -8), (6, -14), 
#  (4, -9), (2, -9), (4, -13), (2, -13), (1, -10), (3, -13), (6, -11), 
#  (1, -13), (2, -10), (3, -9), (1, -9), (7, -9), (1, -12), (7, -13), 
#  (2, -11), (3, -8), (1, -8), (7, -8)}

谢谢,这很聪明,而且运行得很好。 - Jorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接