假设我有一个由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)
我得到的结果与这张图的左边的结果相似:
现在,假设我的网络经历了一个破坏性事件,导致许多节点失败(图片右侧)。我的图G
不再由相同数量的节点组成:graphG2
现在拥有K<NxN
个节点。在这种情况下,我希望能够通过调用来绘制G2
:
我的问题。如何才能确保位置字典pos
不被修改?这意味着:如果节点0
位于位置(0,0)
(左上角),在情景1)中,它没有失败,那么它必须出现在情景2)中的同一位置。这样,这两个网络可以比较,因为第二个网络只是第一个网络的“转换”。谢谢!
我想扩展一下@abdallahsobey的答案。然而,为了使
networkx
图具有更一般的可重用性,我建议将位置和标签信息存储在图结构中,而不是存储在单独的容器中。在从图形的简化版本开始(对于
N = 5
):可以将
^{pr2}$pos
和label
字典存储为图形属性:并将其用于绘图:
以后可以执行图形中的任何操作,例如删除某些节点:
并且不需要实际地重新计算}字典,因为条目会随着图形操作自动更新。以下行与上面的plot call完全相同:
pos
或{但这一次,却产生了不同的形象:
简而言之:将所有可以存储在节点/边属性中的内容,因为它们将随着图形更改而自动更新。在
我很难理解你为什么要问这个问题——代码基本上应该完全按照你想要的方式工作。但是,您有一个错误,这可能是导致您提出这个问题的原因。在
这将使}中的节点。它不会创建一个看起来像
G2
成为None
。G.remove_nodes_from(L)
从G
中删除{G
的新图形,但是没有这些节点。所以它不会返回任何内容。因此,G2
没有被赋予任何值。图形G
已删除这些节点。在因此,以下方法应该有效:
^{pr2}$pos
在此代码中从未更改。在您可以通过将节点从(i,j)重新标记为您在标签字典中的图上看到的数字来实现。然后删除失败的节点。最后,通过简单地反转标签字典,调整pos字典以将位置映射到节点的新标签。以下是我在你的代码后添加的内容:
对于N=5和失败节点[0,4,12,18],这里是我在移除(左)和(右)失败节点之前得到的结果。
相关问题 更多 >
编程相关推荐