如何在 NetworkX 或 igraph 中使用多部分图?
How to work with multipartite graphs in NetworkX or igraph?
我正在使用多方网络,特别是在这种情况下使用四方网络。首先,在 NetworkX 中,似乎只能通过 nx.complete_multipartite_graph() 使用完整的多方网络,而不是更一般的多方网络(如果我错了请纠正我)。如有必要,我可以开始查看 igraph 或其他 Python 包。
受到 James A. Foster's question 的启发,我创建了一个类似于我的网络的图,当然是在较小的范围内并具有它的一些功能。我使用这段代码只是为了以图形方式查看它并帮助解释我想做什么。
我使用了以下命名法:
第一列和第二列构成 "X bipartite network",
第 2 和第 3 列形成 "Y bipartite network",
第 3 和第 4 列组成 "Z bipartite network",
我将所有这些网络都放在单独的文件中。我想将它们集成到一个多方网络中,如下图所示:
Quadripartite graph
(1) 我该如何处理?据我了解,我无法使用 nx.compose() 函数。
我发现的一个问题,至少在这段绘制它的代码中,是因为在我的真实网络中,第 1 列和第 4 列具有相同的元素!因此,如果我在两列中使用相同的名称,NetworkX 解释对我没有用,这就是我在第 4 列中使用不同数字的原因。
(2) 我该怎么办?尽管具有相同的元素,但我需要指定这两列在某种程度上有所不同。
一个重要的信息是这张图是 "temporary ordered",即交互是按时间顺序从左到右发生的,因此禁止在第 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()
非常感谢您的提前帮助,
豪尔赫
我的第一个建议是将三个网络分别保留为 g1
、g2
和 g3
。此外,使 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)}
我正在使用多方网络,特别是在这种情况下使用四方网络。首先,在 NetworkX 中,似乎只能通过 nx.complete_multipartite_graph() 使用完整的多方网络,而不是更一般的多方网络(如果我错了请纠正我)。如有必要,我可以开始查看 igraph 或其他 Python 包。
受到 James A. Foster's question 的启发,我创建了一个类似于我的网络的图,当然是在较小的范围内并具有它的一些功能。我使用这段代码只是为了以图形方式查看它并帮助解释我想做什么。
我使用了以下命名法: 第一列和第二列构成 "X bipartite network", 第 2 和第 3 列形成 "Y bipartite network", 第 3 和第 4 列组成 "Z bipartite network", 我将所有这些网络都放在单独的文件中。我想将它们集成到一个多方网络中,如下图所示:
Quadripartite graph
(1) 我该如何处理?据我了解,我无法使用 nx.compose() 函数。
我发现的一个问题,至少在这段绘制它的代码中,是因为在我的真实网络中,第 1 列和第 4 列具有相同的元素!因此,如果我在两列中使用相同的名称,NetworkX 解释对我没有用,这就是我在第 4 列中使用不同数字的原因。
(2) 我该怎么办?尽管具有相同的元素,但我需要指定这两列在某种程度上有所不同。
一个重要的信息是这张图是 "temporary ordered",即交互是按时间顺序从左到右发生的,因此禁止在第 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()
非常感谢您的提前帮助,
豪尔赫
我的第一个建议是将三个网络分别保留为 g1
、g2
和 g3
。此外,使 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)}