此问题与尝试使用NetworkX建模interdependent networks有关。有专门的软件包(例如Pymnet),但它们似乎不像NetworkX那样灵活。顺便说一句,我想给NetworkX最后一次机会。
所以,让我们说我们有两个独立的图形,G1和G2,我们在同一个图中绘制:
List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1));
现在,如果我们尝试将G1的节点0与G2的节点1连接起来:
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.add_edge(G1.nodes()[0], G2.nodes()[1])
意味着边缘基本上没有被添加,或者它被添加并且没有显示,或者被添加,但是因为它从一个图形运行到另一个图形,所以它不属于它们中的任何一个。
您如何建议在NetworkX中从G1到G2创建此互连,而无需借助其他软件包?
答案 0 :(得分:2)
我认为根本问题在于你对于网络如何从一个图形中思考图形有一个不同的概念。我相信你认为图的节点是某些node
类的对象,节点本身本身就有一些属性说明它们的位置。不是这种情况。没有特殊的node
课程。图形可以将任何可清除对象作为其节点,因为实际上,图形只是一个奇特的字典,其键是我们称之为节点的。
图G1 的节点整数0,1和2. G2的完全相同的节点。您添加的新边缘位于G1.nodes()[0]
中的任何整数和G2.nodes()[1]
中的任何整数之间。在你的例子中,我相信G1已经具备了这一优势。
另外,您创建了两个不同的词组pos1
和pos2
(它们具有相同的键 - 构成两个图的节点的整数值)。这些dicts说明应该在哪里绘制节点。您告诉它使用G1
绘制pos1
。因此,它将{strong> 0的节点的圆圈放在pos1[0]
,类似地放置为1和2.然后当您稍后告诉它使用G
绘制pos1
时它会做同样的事情。
您可能要做的是创建一个新图形,其节点由G1和G2的节点组成,重命名后它们不是相同的节点。这是由union
(see documentation。)
G = union(G1, G2, rename=('G1-', 'G2-'))
然后添加边缘,注意G
中的节点具有不同的名称,因此您使用的命令将无法正常工作。