创建不同节点具有相同标签的图?

时间:2019-06-17 08:07:48

标签: python graph networkx

让我们在networkx中使用基本图形:

import networkx as nx
G = nx.Graph()
G.add_node("A")
G.add_node("B")
G.add_edge("A","B")

将其导出为gml会得到:

graph [
  node [
    id 0
    label "A"
  ]
  node [
    id 1
    label "B"
  ]
  edge [
    source 0
    target 1
  ]
]

现在,我想知道是否有办法让两个不同的节点具有相同的名称,以使我的gml文件看起来像这样:

graph [
  node [
    id 0
    label "A"
  ]
  node [
    id 1
    label "A"
  ]
  edge [
    source 0
    target 1
  ]
]

至少在文件中,id号不同,因此即使具有相同的名称,节点也被唯一标识。可以使用yEd打开此文件,而不会出现任何问题。

从我假设的语法来看,networkx中是不可能的,那么还有什么其他方法可以做到这一点?

背景:

我有一个有向图,其中两个节点XY都具有相同的后继者Z,但是我希望XY都有各自的拥有Z,而不是两个都指向同一个Z。基本上我想要一棵有向树,其中每个节点只有一个前任树,而树中允许重复。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。您需要定义自己的函数,该函数将节点作为输入并将其标签输出为字符串。这有点麻烦,因为该函数实际上是要创建一个字符串,该字符串在节点没有自动转换为字符串的标签的情况下用作标签。但这有效。

import networkx as nx
G = nx.Graph()
G.add_edge('a', 'b')
G.add_edge('b','c')

def stringizer(x):  #replaces both 'a' and 'b' with 'a'
   if x == 'a':
       return 'a'
   elif x == 'b':
       return 'a'
   else:
       return x

nx.write_gml(G, path='tmp.gml', stringizer=stringizer)

输出将节点'a'和'b'都标记为'a'。

graph [
  node [
    id 0
    label "a"
  ]
  node [
    id 1
    label "a"
  ]
  node [
    id 2
    label "c"
  ]
  edge [
    source 0
    target 1
  ]
  edge [
    source 1
    target 2
  ]
]

实践中执行此操作的一种方法是创建字典D[node],该字典会给出标签,然后定义

def stringizer(node):
    return D[node]