首页 > 解决方案 > 创建一个不同节点具有相同标签的图?

问题描述

让我们看一个基本图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,那么还有什么其他方法可以做到这一点?

背景:

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

标签: pythongraphnetworkx

解决方案


是的,这是可能的。您需要定义自己的函数,该函数将节点作为输入并将其标签作为字符串输出。这有点小技巧,因为该函数的真正目的是在节点没有自动转换为字符串的标签的情况下创建用作标签的字符串。但它有效。

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]

推荐阅读