让我们在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
和Y
都具有相同的后继者Z
,但是我希望X
和Y
都有各自的拥有Z
,而不是两个都指向同一个Z
。基本上我想要一棵有向树,其中每个节点只有一个前任树,而树中允许重复。
答案 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]