2012-05-05 7 views
-1

私はすばらしいバイナリツリー図を作成するための解決策を探しています。不完全なノードには、区別できるエッジ(存在する場合)があることが重要です。入れ子リストから.graphmlツリーダイアグラムを作成

ノードを順序付ける方法がわからないため、.dotを使用して目的の結果を生成できませんでした。私はyEdや別のエディタにファイルをインポートしても構いません。しかし、私は少しの構文で非常に簡単にデータを生成できるようにしたい。

私が目指しているのは、 (A(B1 C1 C2)B2)などの最小限のデータからの.graphml形式。ここで、Aはルートラベル、B1はルートの左の子、もう1つの子はB1です。 .dotや.tgfと同様の複雑さはもちろん許容できますが、私は.graphmlを生成するためにコンパイラを自分で作成することは避けたいと思います。

感謝しています。あなたが供給

マルクスR.

+0

あなたは何を意味していますか?空のノードが使用されている場合にのみ.dotで動作しますか? – marapet

+0

つまり、私は不可視の仮想ノード(リーフ)を使用してエッジを指示する必要があります。 –

+0

グラフを可視化する際に、仮想ノードを避ける理由は何ですか? – parselmouth

答えて

1

データはs-expression多かれ少なかれです。これがあなたが摂取したいフォーマットであるとすれば、pyparsing(Pythonモジュール)はs-expression parserです。

また、グラフライブラリが必要です。私はほとんどの仕事にnetworkxを使用しています。 pyparsing S式パーサーとnetworkxで、次のコードは、データを摂取し、有向グラフとしてツリーを作成します。これをテストするために

import networkx as nx 

def build(g, X): 
    if isinstance(X, list): 
     parent = X[0] 
     g.add_node(parent) 
     for branch in X[1:]: 
      child = build(g, branch) 
      g.add_edge(parent, child) 

     return parent 

    if isinstance(X, basestring): 
     g.add_node(X) 
     return X 

#-- The sexp parser is constructed by the code example at... 
#-- http://http://pyparsing.wikispaces.com/file/view/sexpParser.py 
sexpr = sexp.parseString("(A (B1 C1 C2) B2)", parseAll = True) 

#-- Get the parsing results as a list of component lists. 
nested = sexpr.asList() 

#-- Construct an empty digraph. 
dig = nx.DiGraph() 

#-- build the tree 
for component in nested: 
    build(dig, component) 

#-- Write out the tree as a graphml file. 
nx.write_graphml(dig, 'tree.graphml', prettyprint = True) 

、私はまたの.dotファイルとしてツリーを書いて、作成するためにgraphvizのを使用しました以下の画像:

(graphviz output of tree)

networkxは良いグラフライブラリですし、必要に応じて、追加のメタデータでエッジまたはノードをタグ付けするためにあなたの木の上に歩く追加のコードを書くことができます。

+0

ありがとうございます。私はnetworkxライブラリを知らなかった。しかし、結果は私が必要とするものではありません。あなたの例では、削除すると、C2と言うと、生成された新しい画像では、B1からC1までの垂直線があるため、C1が正しい子である(B1には左の子がない) 。私が必要とするのは、その構造を維持するイメージです。それにかかわらず、パーサーは非常に便利です。 –

+0

@MarkusRother "(A(B1 C1 C2)B2)"が現在のツリーを記述している場合、C2が削除された場合に同様の入れ子構造を提供できますか?新しいネストされた構造が "(A(B1 C1)B2)"と表された場合、C1は左の子ではなくB1の右の子であるとどのように区別しますか? – parselmouth

+0

@ MarkusRotherはあなたの前のコメントを読み上げることから "vertical"という単語が目立つようになりました。あなたの質問に対するあなたのコメントと一緒に、 "目に見えない仮想ノード(リーフ)それとも、(おそらく)不完全なツリーのレイアウトと可視化ですか? – parselmouth

関連する問題