一致地从网格图中移除节点

2024-05-01 21:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个由NxN=100x100节点组成的常规2d网格图G。我通过打电话创建这样的网络:

N=100
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() ) #Dictionary of all positions
labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.draw_networkx(G, pos=pos, labels=labels,with_labels=False, node_size=10)

我得到的结果与这张图的左边的结果相似:

enter image description here

现在,假设我的网络经历了一个破坏性事件,导致许多节点失败(图片右侧)。我的图G不再由相同数量的节点组成:graphG2现在拥有K<NxN个节点。在这种情况下,我希望能够通过调用来绘制G2

^{pr2}$

我的问题。如何才能确保位置字典pos不被修改?这意味着:如果节点0位于位置(0,0)(左上角),在情景1)中,它没有失败,那么它必须出现在情景2)中的同一位置。这样,这两个网络可以比较,因为第二个网络只是第一个网络的“转换”。谢谢!


Tags: inpos网络网格forlabels节点dict
3条回答

我想扩展一下@abdallahsobey的答案。然而,为了使networkx图具有更一般的可重用性,我建议将位置和标签信息存储在图结构中,而不是存储在单独的容器中。在

从图形的简化版本开始(对于N = 5):

N = 5
G = nx.grid_2d_graph(N,N)
pos = dict((n, n) for n in G.nodes())
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes())

可以将poslabel字典存储为图形属性:

^{pr2}$

并将其用于绘图:

nx.draw_networkx(G, pos=nx.get_node_attributes(G, 'pos'),
                 labels=nx.get_node_attributes(G, 'labels'),
                 with_labels=True, node_size=500)

enter image description here

以后可以执行图形中的任何操作,例如删除某些节点:

G.remove_nodes_from([(0,0),(0,2),(2,2),(2,1)])

并且不需要实际地重新计算pos或{}字典,因为条目会随着图形操作自动更新。以下行与上面的plot call完全相同:

nx.draw_networkx(G, pos=nx.get_node_attributes(G, 'pos'),    
                 labels=nx.get_node_attributes(G, 'labels'), 
                 with_labels=True, node_size=500)

但这一次,却产生了不同的形象:

enter image description here

简而言之:将所有可以存储在节点/边属性中的内容,因为它们将随着图形更改而自动更新。在

我很难理解你为什么要问这个问题——代码基本上应该完全按照你想要的方式工作。但是,您有一个错误,这可能是导致您提出这个问题的原因。在

G2= G.remove_nodes_from(failed_nodes_dict) #Failed_node_dict holds the disrupted nodes

这将使G2成为NoneG.remove_nodes_from(L)G中删除{}中的节点。它不会创建一个看起来像G的新图形,但是没有这些节点。所以它不会返回任何内容。因此,G2没有被赋予任何值。图形G已删除这些节点。在

因此,以下方法应该有效:

^{pr2}$

pos在此代码中从未更改。在

您可以通过将节点从(i,j)重新标记为您在标签字典中的图上看到的数字来实现。然后删除失败的节点。最后,通过简单地反转标签字典,调整pos字典以将位置映射到节点的新标签。以下是我在你的代码后添加的内容:

nx.relabel_nodes(G,labels,False)
G.remove_nodes_from([0,4,12,18])            
pos = {y:x for x,y in labels.iteritems()}
nx.draw_networkx(G, pos=pos, with_labels=True, node_size = 300)

对于N=5和失败节点[0,4,12,18],这里是我在移除(左)和(右)失败节点之前得到的结果。 enter image description here

相关问题 更多 >