pydot:是否可以在其中绘制两个具有相同字符串的不同节点?

Sci*_*ion 9 python decision-tree pydot

我正在使用pydot在python中绘制图形.我想代表一个决策树,比如说(a1,a2,a3是属性,两个类是0和1:

       a1>3
      /    \
  a2>10    a3>-7
   /  \     /  \
  1    0   1    0
Run Code Online (Sandbox Code Playgroud)

但是,使用pydot,只创建了两个叶子,树看起来像这样(png附加):

       a1>3
      /    \
  a2>10    a3>-7
      |  X  |
      1     0
Run Code Online (Sandbox Code Playgroud)

现在,在这个简单的情况下,逻辑很好,但在较大的树中,属于不同分支的凌乱的内部节点是统一的.

我正在使用的简单代码是:

import pydot
graph = pydot.Dot(graph_type='graph')
edge = pydot.Edge("a_1>3", "a_2>10")
graph.add_edge(edge)
edge = pydot.Edge("a_1>3", "a_3>-7")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "1")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "0")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "1")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "0")
graph.add_edge(edge)
graph.write_png('simpleTree.png')
Run Code Online (Sandbox Code Playgroud)

我还尝试创建不同的节点对象而不是创建边缘,而不是将其添加到图形中,但似乎pydot会检查节点池中是否有相同名称的节点而不是创建新节点.

有任何想法吗?谢谢!

上面代码创建的图像

Mar*_*ers 13

您的节点始终需要唯一的名称,否则您无法将它们唯一地命名为在它们之间附加边.但是,您可以为每个节点提供一个标签,这是呈现时显示的标签.

因此,您需要添加具有唯一ID的节点:

graph = pydot.Dot(graph_type='graph')
graph.add_node(pydot.Node('literal_0_0', label='0'))
graph.add_node(pydot.Node('literal_0_1', label='0'))
graph.add_node(pydot.Node('literal_1_0', label='1'))
graph.add_node(pydot.Node('literal_1_1', label='1'))
Run Code Online (Sandbox Code Playgroud)

然后添加连接这些节点的图形边缘:

edge = pydot.Edge("a_2>10", "literal_0_0")
graph.add_edge(edge)
edge = pydot.Edge("a_2>10", "literal_1_0")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "literal_0_1")
graph.add_edge(edge)
edge = pydot.Edge("a_3>-7", "literal_1_1")
graph.add_edge(edge)
Run Code Online (Sandbox Code Playgroud)

与您定义的其余边缘一起使得:

边缘正确的图形