我正在尝试使用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绘图中显示此决定,我很高兴听到!
答案 0 :(得分:0)
您的问题不在于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')
将绘制以下图形: