2011-08-11 10 views
9

多方向ツリーを審美的にもっともらしい方法でプロットする方法を知っていますか? 情報:Pythonのマルチウェイツリーの描画とレンダリング

  • 多かれ少なかれ100件のアイテム
  • 各レベルは約アイテム
  • 10レベル
  • 同じ数の各ノードは、各ノード
  • (葉)0〜6つのチャイルズを持っています彼のルーツに関係なく、自分のレベルを指定します。私は現在、私はあなたがすることを願って、PILを使用してノードの img.size()[0] /数に各「行」を分割して、エッジを表現するために draw.lineで線を引くが、それは、 完全

    を台無しにされています

助けてください]、私は必要な情報を投稿します。

答えて

15

したがって、グラフのレンダリングは、特定の天才graphvizです。これには、Pythonバインディングを提供するライブラリもいくつかあります。私の意見では、これらのバインディングライブラリの中で最高のものはpygraphvizです。 Graphvizはおそらく最も良い解決策であり、おそらく最も単純なものです。

、あなたの質問、階層、階層方式で記述する特定のレイアウトは、graphvizの「ドットレイアウトエンジンによって簡単に行われます。 ドットは、グラフが自然な木構造に配置されていることを保証するためにレンダリングを実行します。つまり、親ノードは子の上に配置されます。同じランク(ルートからのレベル)のノードは、可能な場合はy軸でw/r/tの等位に配置され、自然対称性は可能な限り保存されます。

(注意:紛らわしい、ドットGraphvizの構成する複数のレイアウトエンジンのいずれかを意味するが、ドットは、彼らがどのようにレンダリングされるかに関係なく、すべてのGraphvizの文書のファイル形式の名前とファイルの拡張子です)。

あなたがpygraphvizを使用して、以下の私のコードで見ることができるように、それは実際にデフォルト(格好いいがある)ではないのですけれども、それは、あなたのグラフのレイアウトエンジンとしてドットを選択するように簡単です。

は、ここに私が作った後、ドットを使用してレンダリング迅速なグラフだ --createdとpygraphviz経由graphvizのを使用してレンダリング。

グラフが完全なレイアウトであることに注意してください。同じ程度のノードは垂直軸に沿って同じレベルにあり、子供は親の下にレンダリングされ、自然な「対称性」は可能な限り保存されます(例えば、親ノードが配置されます表示されているように、私のコードのどれもレイアウトを手動で制御するものはありません。つまり、のドットは自動的に処理されます。

import pygraphviz as PG 

A = PG.AGraph(directed=True, strict=True) 

A.add_edge("7th Edition", "32V") 
A.add_edge("7th Edition", "Xenix") 
# etc., etc. 

# save the graph in dot format 
A.write('ademo.dot') 

# pygraphviz renders graphs in neato by default, 
# so you need to specify dot as the layout engine 
A.layout(prog='dot') 


# opening the dot file in a text editor shows the graph's syntax: 
digraph unix { 
    size="7,5"; 
    node [color=goldenrod2, style=filled]; 
    "7th Edition" -> "32V"; 
    "7th Edition" -> "V7M"; 
    "7th Edition" -> "Xenix"; 
    "7th Edition" -> "UniPlus+"; 
    "V7M" -> "Ultrix-11"; 
    "8th Edition" -> "9th Edition"; 
    "1 BSD" -> "2 BSD"; 
    "2 BSD" -> "2.8 BSD"; 
    "2.8 BSD" -> "Ultrix-11"; 
    "2.8 BSD" -> "2.9 BSD"; 
    "32V" -> "3 BSD"; 
    "3 BSD" -> "4 BSD"; 
    "4 BSD" -> "4.1 BSD"; 
    "4.1 BSD" -> "4.2 BSD"; 
    "4.1 BSD" -> "2.8 BSD"; 
    "4.1 BSD" -> "8th Edition"; 
    "4.2 BSD" -> "4.3 BSD"; 
    "4.2 BSD" -> "Ultrix-32"; 
} 

enter image description here

+0

完璧、私はちょうど、レイアウト、色、イエスの血を最適化するために持っている...ありがとう。 =] – BrainStorm

+0

@doug、ノードレベル(行)をパラメータで設定するにはどうすればいいですか?ただ美学のために。 – BrainStorm

+0

@BrainStorm:まあ、ドットは通常、追加設定なしでそれを処理します。このノード構成を強制するには、明示的な制約を設定するのは難しくありませんが、次の2つのステップが必要です。(1)グラフ内のノードのグループが水平位置が同じになるように定義する。 (ii)サブグラフの定義で、rank =同じように 'rank'属性を設定します。サブグラフを説明するためにコメントにスペースが不足していますが、このページは簡単な例です。http://www.graphviz.org/content/cluster – doug

関連する問題