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

Graph NetworkX:在Python中连接两个独立图形的节点,graph,nodes,networkx,edges,complex-networks,Graph,Nodes,Networkx,Edges,Complex Networks,这个问题是关于尝试使用NetworkX建模。有专门的软件包(如),但它们似乎没有NetworkX灵活。顺便说一下,我想给NetworkX最后一次机会 假设我们有两个独立的图,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_alber

这个问题是关于尝试使用NetworkX建模。有专门的软件包(如),但它们似乎没有NetworkX灵活。顺便说一下,我想给NetworkX最后一次机会

假设我们有两个独立的图,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
类的对象,这些节点本身就有一些属性,表示它们的位置。事实并非如此。没有特殊的
节点
类。一个图可以有任何散列对象作为它的节点,因为实际上,一个图只是一个奇特的dict,它的键就是我们所说的节点

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

分别创建了两个不同的dict
pos1
pos2
(它们具有相同的键-构成两个图节点的整数值)。这些命令说明了节点应该被标绘在哪里。您已经告诉它使用
pos1
绘制
G1
。因此它将0的节点的圆放置在
pos1[0]
处,同样地,对于1和2。然后,当您稍后告诉它使用
pos1
绘制
G
时,它将执行完全相同的操作

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


然后添加边,注意
G
中的节点有不同的名称,因此您使用的命令不太有效。

但这会创建一个唯一的图形G,将G1和G2压缩成一个唯一的对象。因此,基本上,在NetworkX中,由两个或多个网络组成的互联网络的整个想法是不可行的。我认为这个软件包还有改进和添加功能的空间,所以允许这样做。这个软件包中有很多东西,而且它确实在不断改进和添加功能(v2.0很快就会面世)。但是,我认为,从我的答案到“拥有两个或更多网络的互联网络的整个想法在NetworkX中是不可行的”这一结论是一个很大的飞跃。我给了你一种方法,但显然不能让你满意。另一种方法是创建一个新的图,其节点是图
G1
G2
。[ctd]创建一个由多个互连网络组成的网络非常简单,但如何实现这一点将取决于您的需求。无论如何,它将导致一个更大的对象以某种格式包含两个网络。这本身并不是重组软件包存储网络方式的理由,也不是你的回答不能让我满意。确实如此,我发现它真的很有用(我投了更高的票)。在某些情况下,例如,当您想要对相互依赖的基础设施进行建模时(肯定比G1和G2更大),您需要更直观的东西,特别是因为节点位置将表示现实世界中的物理对象。
G = union(G1, G2, rename=('G1-', 'G2-'))