我正在尝试使用 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
您的问题不在于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')
这将绘制以下图表:
我是一名优秀的程序员,十分优秀!