2

这个问题是关于尝试使用 NetworkX对相互依赖的网络进行建模。有专用的包(例如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 的互连,而不求助于其他包?

4

1 回答 1

2

我认为根本的问题是你对networkx如何看待一个图有一个不同的概念。我相信您认为图形的节点是某个node类的对象,节点本身本质上具有一些属性来说明它们的位置。不是这种情况。没有特殊的node班级。一个图可以有任何可散列的对象作为它的节点,因为实际上,一个图只是一个花哨的字典,它的键就是我们所说的节点。

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

另外,您创建了两个不同的 dictspos1pos2(它们具有相同的键 - 形成两个图的节点的整数值)。这些 dicts 说明应该在哪里绘制节点。你已经告诉它G1使用pos1. 因此,它将0的节点放置圆圈,pos1[0]并为 1 和 2 放置类似的圆圈。然后,当您稍后告诉它G使用它进行绘图时,pos1它会做完全相同的事情。

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

G = union(G1, G2, rename=('G1-', 'G2-'))

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

于 2017-06-15T20:17:41.957 回答