したがって、グラフのレンダリングはgraphvizの特別な天才であり、Pythonバインディングを提供するいくつかのライブラリもあります。私の意見では、これらのバインディングライブラリの中で最も優れているのはpygraphvizです。Graphvizはおそらく最良の解決策であり、おそらく最も単純な解決策でもあります。
質問で説明する特定のレイアウト、階層的な階層化されたスキームは、graphvizのドットレイアウトエンジンによって簡単に実行されます。Dotはレンダリングを実行して、グラフが自然なツリー構成でレイアウトされるようにします。つまり、親ノードが子の上に配置されます。等しいランク(ルートからのレベル)のノードは、可能な場合はy軸と同じ位置に配置され、可能な場合は自然な対称性が維持されます。
(注:紛らわしいことに、ドットはgraphvizを構成するいくつかのレイアウトエンジンの1つを指しますが、ドットは、レンダリング方法に関係なく、すべてのgraphvizドキュメントのファイル形式の名前とファイル拡張子でもあります)。
次のコードでわかるように、pygraphvizを使用すると、グラフのレイアウトエンジンとしてドットを選択するのは簡単ですが、実際にはデフォルトではありません(ネイトはそうです)。
これが私が作成し、ドットを使用してレンダリングしたクイックグラフです-pygraphvizを介してgraphvizを使用して作成およびレンダリングしました。
グラフのレイアウトが完璧であることに注意してください。同じ次数のノードは垂直軸に沿って同じレベルにあり、子は親の下にレンダリングされ、可能な場合は自然な「対称性」が保持されます(たとえば、親ノードはその間と上に配置されます)。 2つの子ノード。ご覧のとおり、私のコードはいずれも手動でレイアウトを制御していません。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";
}
