【问题标题】:NetworkX read_dot does not inherit attributesNetworkX read_dot 不继承属性
【发布时间】:2023-03-12 07:56:01
【问题描述】:

我正在尝试使用 NetworkX 将 sklearn.tree.export_to_graphviz 生成的 .dot 文件读入图表。我计划将此图添加为 pyplot 图中的子图。虽然我可以使用 nx.drawing.nx_pydot.read_dot 来获取图形结构,但所有标签似乎都消失了。

这就是我正在尝试的:

randTree = (nx.drawing.nx_pydot.read_dot("tree_output.dot"))
nx.draw_networkx(randTree)

.dot 文件是:

digraph Tree {
node [shape=box] ;
0 [label="X[0] <= 332.72\nsamples = 19\nvalue = -0.41"] ;
1 [label="samples = 11\nvalue = -0.67"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="X[0] <= 576.73\nsamples = 8\nvalue = -0.04"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="samples = 4\nvalue = -0.05"] ;
2 -> 3 ;
4 [label="samples = 4\nvalue = -0.03"] ;
2 -> 4 ;
}

结果是一个带有 4 个标记为 1-4 的圆圈的图形,没有任何其他标签或属性(我想盒子形状是节点的属性,所以它们都是圆圈),链接如下。如果有另一种方法可以在 pyplot 情节中显示此决定,我很乐意听到!

Resulting Graph

【问题讨论】:

    标签: python networkx decision-tree


    【解决方案1】:

    您的问题不在于nx.drawing.nx_pydot.read_dot,而在于绘制网络。 读取点文件时会保留标签,但是您需要稍微不同地使用 NetworkX'drawing API 来绘制标签。例如:

    import networkx as nx
    import matplotlib.pyplot as plt
    import ast
    
    randTree = (nx.drawing.nx_pydot.read_dot('tree_output.dot'))
    labels = {n[0] : ast.literal_eval(n[1]['label']) for n in randTree.nodes(data=True)}
    nx.draw_networkx(randTree, with_labels=True, labels=labels)
    plt.show()
    

    将画:

    编辑:

    您也可以将图形转换为Graphviz AGraph 并绘制如下:

    import networkx as nx
    
    A = nx.drawing.nx_agraph.to_agraph(nx.drawing.nx_pydot.read_dot('tree_output.dot'))
    A.layout('dot')
    A.draw('tree.png')
    

    这将绘制以下图形:

    【讨论】:

    • 有没有办法从 .dot 文件中获取所有属性(例如盒子形状和边缘标签)并将它们同时插入到 NetworkX 图中?还是逐个功能地提取所有内容?
    • 我以为你想用 matplotlib pyplot 显示你的图表,然后你必须逐个特征地转换它(我已经展示了如何提取标签,节点的定位可以用 layouts,带有 node_shape 参数的节点形状等)。我编辑了原始答案以显示如何使用输入点文件中的所有 graphviz 属性来可视化图形。希望它有所帮助:)
    • 不幸的是,我使用的 Windows 显然不能很好地与 pygraphviz 配合使用,所以我无法采用最终是我想要实现的解决方案:(
    • 它可以在windows上运行,不妨看看这里:stackoverflow.com/q/4571067/3782865
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2017-08-10
    • 2019-06-12
    • 2013-09-02
    • 2012-05-08
    • 2012-08-15
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多