Сетевой read_dot не наследует атрибуты - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь прочитать файл .dot, созданный sklearn.tree.export_to_graphviz, в график с использованием NetworkX.Я планирую добавить этот график в качестве подзаговора в граф 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, без каких-либо других меток или свойств (я думаю, что форма прямоугольника является свойством узла, поэтомуони все круги), что связано ниже.Если есть другой способ показать это решение на графике, я был бы рад услышать!

Результирующий график

1 Ответ

0 голосов
/ 30 января 2019

Ваша проблема не с nx.drawing.nx_pydot.read_dot, а с прорисовкой сети.При чтении файла точек метки сохраняются, однако для рисования меток вам потребуется использовать API рисования NetworkX немного по-другому.Например:

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()

Будет рисовать:

enter image description here

Редактировать:

Вы также можете преобразовать график в 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')

, который нарисует следующий график:

enter image description here

...