【问题标题】:NetworkX in Python: Connect only values not keysPython中的NetworkX:只连接值而不是键
【发布时间】:2016-04-05 15:46:03
【问题描述】:

我面临与 SO 问题here 类似的问题,数据与描述的几乎相同:

graph = {
    '1': ['2', '3', '4'],
    '2': ['5','11','12','13','14','15'],
    '3' : ['6','7','66','77'],
    '5': ['6', '8','66','77'],
    '4': ['7','66','77'],
    '7': ['9', '10']
}

但是,如果我将此图形数据输入到链接脚本中,它会将数据的键与值连接起来(例如,“1”(第一行的键)与“2”(第二行的键)连接数据集中的下一行)。
以示例为例:我想将第一行的“1”与第一行的 2、3、4 连接,但不与 2 连接第二行的。此外,我想将所有值相互连接,例如 2 与 3 与 4 与 5 与 11 等等。

这是否清楚?

应保留链接脚本的所有剩余功能(例如通过数边调整节点的圆大小、节点标记等)。

编辑
感谢 Wayne Werner,我注意到我的解释中有一个错误:考虑上述数据集的以下数据:

'3' : ['6','7','66','77'],
'5': ['6', '8','66','77'],

在这种情况下,我想将 3 与 6、7、66、77 连接,而不是将 3 与 5 连接。
此外,我想将 5 与 6、8、66、77 连接起来。

【问题讨论】:

  • 除非我弄错了,否则您要求的是不要执行该工具旨在执行的操作。如果您不想将“1”连接到“2”,请将其从 ['2', '3', '4'] 中删除
  • 感谢韦恩,感谢您的回复。但是,我想我说得不够清楚:“1”应该与[“2”,“3”,“4”]连接,括号中的数字也应该连接(也与下一个数字连接)括号内的行)。应该连接的值是 "1" [...] 和下一行的 "2" [...]在数据集中。有了这些信息,请重新阅读我最初的问题。如果还有不清楚的地方,我会再解释一遍;)
  • 只看代码而不阅读文档我猜你是通过'node': ['connection_1', 'connection_2', 'etc'] 指定连接的。如果我没看错,你想要'node1': ['node2'], 'node2':['fnord'],但你不希望node1 连接到node2。这对我来说没有任何意义。您是否了解 networkx 以不同的方式工作,或者您是否要求做除此之外的其他事情?
  • 再次感谢您的回复!我希望我正确理解networkX^^但是是的,你说得对:我想将节点与connection_1和connection_2连接,但不是将节点与node1连接,而不是与node2连接。我加强了你的榜样。请考虑以下数据(除了您的示例):'node2':['fnord', 'connection_1']。在这种情况下,我想将 node 的 connection_1 与 node2 的 connection_1 连接起来。这清楚吗? (我现在也更新了最初的问题,因为你在我的问题中显示了一个错误^^)
  • 我认为您的理解并不正确,因为您同时要求两种不同的东西。你有一个节点图。您指定节点和要连接的节点。即'1': ['2', '3', '4],您是说您希望 1 连接到 2、3 和 4。句号。没有别的了。如果您添加 '2': ['3', '4', '5'],那么您的意思是希望 2 连接到 3、4 和 5。将连接到 1,因为您说过当你写 '1': ['2', '3', '4'] 时,你希望 1 连接到 2。

标签: python matplotlib networkx


【解决方案1】:

您的问题是可能的,我认为您只是对 NetworkX 图形的工作方式感到困惑。向图中添加节点时,您传入一个 ID 来表示该节点。 NetworkX 在内部使用此值来跟踪各个节点。将两个节点连接在一起时,您传递两个 id(代表节点)进行连接。

在您对问题的解释中,您希望 NetworkX 两次接受相同的 ID,但“忘记”该 ID 已经代表一个节点。这是不可能的。

你有两个选择:

  1. 单独绘制各个图表(这允许您随意重复使用 ID)
  2. 为每个子图创建唯一 ID,但更改节点上的标签。

以下是第二种方法的示例。这里graph 字典中的键用于为每个子图创建一个唯一的 ID 集,例如1_21_31_4 等。我们使用标签存储唯一 ID,并在创建绘图时应用它们。这样一来,它看起来就像多个节点具有相同的 ID,即使它们没有。

import networkx
from itertools import combinations

graph = {
    '1': ['2', '3', '4'],
    '2': ['5','11','12','13','14','15'],
    '3' : ['6','7','66','77'],
    '5': ['6', '8','66','77'],
    '4': ['7','66','77'],
    '7': ['9', '10']
}

g = networkx.Graph()
labels = {}

for k, vs in graph.items():
    vs.append(k)
    for a, b in combinations(vs, 2):
        # We're creating multiple 'subnetworks', so prefix the ids
        node_a = '%s_%s' % (k, a)
        node_b = '%s_%s' % (k, b)

        g.add_edge(node_a,node_b)

        # Store labels
        labels[node_a] = a
        labels[node_b] = b

# Draw the graph, replacing the labels to hide the unique IDs            
networkx.draw_spring(g, labels=labels)

这会生成以下图像,您可以看到多个节点具有相同的标签,即使在幕后它们具有不同的 ID。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2020-08-23
    • 2018-09-11
    • 2021-08-25
    • 2022-08-08
    • 1970-01-01
    相关资源
    最近更新 更多