2012-10-22 23 views
8

私はPythonでグラフを描画するためにPYDOT使用しています。 私は決定木を表現したい、と言うようなもの(A1、A2、A3は属性であり、2つのクラスは、0と1のとおりです。pydot:2つの異なるノードを同じ文字列でプロットすることは可能ですか?

 a1>3 
    / \ 
    a2>10 a3>-7 
/\ /\ 
    1 0 1 0 

しかし、PYDOTを使用して、2つだけ葉が作成され、木されていますロジックは結構です、この単純なケースでは、

 a1>3 
    / \ 
    a2>10 a3>-7 
     | X | 
     1  0 

今が、大きな木では異なるブランチに属する乱雑内部ノードが統一されている

I」は単純なコードを:この(添付PNG)のように見えます。使用方法:

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

また、エッジを作成してグラフに追加する以外のノードオブジェクトを作成しようとしましたが、新しいノードを作成するのではなく、ノードプールで同じ名前のノードをチェックしているようです。

アイデア?ありがとう!

the image created by the code above

答えて

13

あなたのノードが常にそうでなければ、それらの間のエッジを添付する一意に名前を付けることができない、ユニークな名前が必要です。ただし、各ノードには、レンダリング時に表示されるラベルを付けることができます。

だから、ユニークなIDを持つノードを追加する必要があります:あなたは、これが作る定義されたエッジの残りの部分と一緒に

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) 

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

その後、これらのノードを接続するグラフのエッジを追加します。

graph with correct edges

1

"標準的な" 答えは、使用することですnetworkxdoes hereなどの標準ライブラリからuuidモジュール。

これはあなたの元のグラフ内のノードに対応pydotためのノード名を作成するidを使用するよりも優れているので、あなたは、あなたのpydotグラフを構築している間、(理論的に)ノードオブジェクトが削除される場合にidウォン」必然的にユニークである。これとは対照的に、作成されたUUIDオブジェクトは、独自の永続的な、元のノードの寿命とは無関係です。

あなたは、むしろそうであるpydotグラフを作成しながら、しかしそのためには、非常に奇妙な何かが起こってしなければなりません。 idを使用する利点は、あなたが(あなたがノードを追加した後、一貫してエッジを構築するように)を構築し、UUIDオブジェクトに、元のノードからのマッピングの周囲を通過する必要がないことです。

networkx(たとえばa)に2つの異なるグラフに同じハッシュ可能オブジェクトが含まれている可能性があります。idは、ノードで直接使用することはできません。 str(id(node)) + str(id(graph)):しかし、その場合には、idは依然としてとして(ノード、グラフ)のペアを組み合わせて使用​​することができます。

関連する問題