gpt4 book ai didi

python - 将 graphviz.dot.Digraph 转换为 networkx.Graph

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:16 33 4
gpt4 key购买 nike

问题

如何将 graphviz.dot.Digraph 转换为 networkx.Graph(或其任何子类)?

动机

LightGBM 是基于树的算法的实现,有一个返回 graphviz.dot.Digraph 对象的函数。这种类型的对象可以表示任何有向图,但我的图具体是一棵树,因此可以通过更简单的嵌套结构在 JSON 中表示:

var tree = {
"name": "parent",
"children": [
{
"name": "child_1"
}
{
"name": "child_2"
}
[
}

上述 JSON 结构的另一个更长的示例是 here 。我使用此 JSON 格式在 javascript 中使用 d3 创建树可视化。

总的来说,我需要将此 graphviz.dot.Digraph 对象转换为上述嵌套 JSON 格式。

如果我可以将此graphviz.dot.Digraph对象转换为networkx.Graph对象,我可以使用this method将其转换为所需的 JSON 格式。这种中间转换对我来说是有问题的。看来我需要再次转换为 networkx can use .

最佳答案

graphviz.dot.Digraph转换为networkx.Graph的一种方法是将其转换为pydotplus.graphviz.Dot对象,并将其转换为继承自 graphnetworkx.classes.multidigraph.MultiDiGraph 对象。

#--------------------
# Do whatever it is you do to create the graphviz.Digraph object
import lightgbm as lgbm

# .......
digraph = lgbm.create_tree_digraph(model)
print(type(digraph)) # prints <class 'graphviz.dot.Digraph'>


#--------------------
# Perform the conversion to networkx
import pydotplus
import networkx

dotplus = pydotplus.graph_from_dot_data(digraph.source)
print(type(dotplus)) # prints <class 'pydotplus.graphviz.Dot'>
# if graph doesn't have multiedges, use dotplus.set_strict(true)
nx_graph = networkx.nx_pydot.from_pydot(dotplus)
print(type(nx_graph)) # prints <class 'networkx.classes.multidigraph.MultiDiGraph'>

其余部分仅供考虑转换为 JSON 的人使用

#--------------------
# Optionally, convert to json
import json

# must specify whatever node is the root of the tree, here its 'split0'
# or you can try list(graph)[0] if you're not sure.
data = networkx.readwrite.json_graph.tree_data(nx_graph,root='split0')
# data is just a dictionary. Dump results in proper json format.
json.dump(data,open(file_path,'w'))

后来我发现 LightGBM 实际上有一个 dump_model 方法可以简化所有这些...但我将把它留在这里。

关于python - 将 graphviz.dot.Digraph 转换为 networkx.Graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47681617/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com