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 的对象,节点本身本质上有一些属性来说明它们的位置。不是这种情况。没有特别的node
class。图可以将任何可哈希对象作为其节点,因为实际上,图只是一个奇特的字典,其键就是我们所说的节点。
图 G1 的节点是 整数 0、1 和 2。G2 具有完全 相同的节点。您添加的新边位于 G1.nodes()[0]
中的任何整数和 G2.nodes()[1]
中的任何整数之间。在您的示例中,我相信 G1 已经拥有该优势。
另外,您创建了两个不同的字典 pos1
和 pos2
(它们具有相同的键 - 形成两个图的节点的整数值)。这些指令说明了应该在何处绘制节点。您已经告诉它使用 pos1
绘制 G1
。因此它将 是 0 的节点的圆圈放在 pos1[0]
处,对于 1 和 2 也类似。然后当你稍后告诉它使用 [= 绘制 G
15=] 它会做同样的事情。
您可能想要做的是创建一个新图,其节点由 G1 和 G2 的节点组成,重命名后它们不是相同的节点。这是由 union
(see documentation.)
完成的
G = union(G1, G2, rename=('G1-', 'G2-'))
然后添加边,注意 G
中的节点具有不同的名称,因此您使用的命令将无法正常工作。
这个问题是关于尝试建模 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 的对象,节点本身本质上有一些属性来说明它们的位置。不是这种情况。没有特别的node
class。图可以将任何可哈希对象作为其节点,因为实际上,图只是一个奇特的字典,其键就是我们所说的节点。
图 G1 的节点是 整数 0、1 和 2。G2 具有完全 相同的节点。您添加的新边位于 G1.nodes()[0]
中的任何整数和 G2.nodes()[1]
中的任何整数之间。在您的示例中,我相信 G1 已经拥有该优势。
另外,您创建了两个不同的字典 pos1
和 pos2
(它们具有相同的键 - 形成两个图的节点的整数值)。这些指令说明了应该在何处绘制节点。您已经告诉它使用 pos1
绘制 G1
。因此它将 是 0 的节点的圆圈放在 pos1[0]
处,对于 1 和 2 也类似。然后当你稍后告诉它使用 [= 绘制 G
15=] 它会做同样的事情。
您可能想要做的是创建一个新图,其节点由 G1 和 G2 的节点组成,重命名后它们不是相同的节点。这是由 union
(see documentation.)
G = union(G1, G2, rename=('G1-', 'G2-'))
然后添加边,注意 G
中的节点具有不同的名称,因此您使用的命令将无法正常工作。