首页 文章

如何使用NetworkX或igraph中的多方图?

提问于
浏览
2

我正在使用多方网络,特别是在这种情况下使用四方网络 . 首先,在NetworkX中似乎只能通过nx.complete_multipartite_graph()来使用完整的多方网络,而不是使用更常见的多方网络(如果我错了请纠正我) . 如有必要,我可以开始查看igraph或其他Python包 .

灵感来自于James A. Foster's question,我创建了一个类似于我的网络画,当然规模较小,并且具有一些功能 . 我只使用此代码以图形方式查看它,并帮助解释我想要做什么 .

我使用了以下命名法:第一列和第二列形成“X二分网络”,第二和第三列形成“Y二分网络”,第三和第四列形成“Z二分网络”,我拥有所有这些网络单独的文件 . 我想将它们整合到一个多方网络中作为这个绘图:

Quadripartite graph

(1)我该如何处理?据我了解,我不能使用nx.compose()函数 .

我发现的一个问题,至少在这个用于绘制它的代码中,是因为在我的真实网络中第1和第4列具有相同的元素!因此,如果我在两列中使用相同的名称,则NetworkX解释对我没用,这就是我在第4列中使用不同数字的原因 .

(2)我该怎么办?我需要指定尽管具有相同的元素,但两个列在某种程度上是不同的 .

一个重要的信息是这个图是“临时有序的”,即,交互按时间顺序从左到右发生,因此禁止第1和第4列之间的自循环,这些列对我来说特别重要 .

(3)如何在第1列和第4列之间提取网络?例如,在这个小网络中,节点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()

非常感谢您的帮助,

乔治

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

相关问题