NetworkX:连接 Python 中两个独立图的节点

NetworkX: connect nodes of two separate graphs in Python

这个问题是关于尝试建模 interdependent networks with NetworkX. There are dedicated packages (such as Pymnet),但它们似乎不如 NetworkX 灵活。顺便说一下,我想给 NetworkX 最后一次机会。

所以,假设我们有 2 个单独的图,G1 和 G2,我们将它们绘制在同一张图中:

import networkx as nx
import matplotlib.pyplot as plt

G1=nx.barabasi_albert_graph(3, 2) #n=3, m=2 (number of initial links)
G2=nx.barabasi_albert_graph(3, 2)
pos1=nx.spring_layout(G1)
pos2=nx.spring_layout(G2)
nx.draw_networkx(G1,pos=pos1,node_color='red') #G1 is red
nx.draw_networkx(G2,pos=pos2,node_color='green') #G2 is green

现在,如果我们尝试连接 G1 的节点 0 和 G2 的节点 1:

G1.add_edge(G1.nodes()[0], G2.nodes()[1]) 

我们没有收到任何错误,但是如果您再次绘制图表,图像与之前完全一样。如果你检查边的数量,你会得到和以前一样的结果:

In[17]: G1.edges()
Out[17]: [(0, 1), (0, 2), (1, 2)]

In[18]: G2.edges()
Out[18]: [(0, 2), (1, 2)]

表示这条边基本没加,或者加了不显示,或者加了,但是因为从一个图跑到另一个图,所以不属于任何一个。

您如何建议在 NetworkX 中创建从 G1 到 G2 的这种互连,而不求助于其他包?

我认为最根本的问题是您对 networkx 如何看待图表的概念与图表本身有不同的概念。我相信你在想图的节点是一些 node class 的对象,节点本身本质上有一些属性来说明它们的位置。不是这种情况。没有特别的nodeclass。图可以将任何可哈希对象作为其节点,因为实际上,图只是一个奇特的字典,其键就是我们所说的节点。

图 G1 的节点是 整数 0、1 和 2。G2 具有完全 相同的节点。您添加的新边位于 G1.nodes()[0] 中的任何整数和 G2.nodes()[1] 中的任何整数之间。在您的示例中,我相信 G1 已经拥有该优势。

另外,您创建了两个不同的字典 pos1pos2(它们具有相同的键 - 形成两个图的节点的整数值)。这些指令说明了应该在何处绘制节点。您已经告诉它使用 pos1 绘制 G1。因此它将 0 的节点的圆圈放在 pos1[0] 处,对于 1 和 2 也类似。然后当你稍后告诉它使用 [= 绘制 G 15=] 它会做同样的事情。

您可能想要做的是创建一个新图,其节点由 G1 和 G2 的节点组成,重命名后它们不是相同的节点。这是由 union (see documentation.)

完成的
G = union(G1, G2, rename=('G1-', 'G2-'))

然后添加边,注意 G 中的节点具有不同的名称,因此您使用的命令将无法正常工作。