初めてのpython 1: GraphVizでxlabelが使い物にならないのでpythonでヘルパークラスを書いた
xLabelが使い物にならないって?
Digraph (rankdir=‘LR’)で、ラベルより小さな同じサイズのノードを並べたくて、ラベルを外に出すために、xLabel (external label)を指定してみたが、位置を制御できない。
ラベルを枠なしのノードにしても良いが、ノードの数が増えすぎてシャレにならなかったし、間隔の制御も難しかった
subgraphを使う方法を見つけたが、subgraphを量産するのが面倒
という訳で、「コード生成でしょう!」と普通はなるので、graphvizのpython packageを使って、カプセル化してみた。
http://graphviz.readthedocs.io/en/latest/manual.html
後先逆になるが、このために、1か月前にpython入門して、ざっくり掴んだので、この週末に初回バージョンを作成したので、恥ずかしながら公開。
元ネタ
http://d.hatena.ne.jp/simply-k/20100727/1280224098
- ラベル位置は上下のみなのでDigraph, rankdir=‘LR'限定と思われる
- rank = sameが使えなくなるので、別途対策が必要
xLabelが使い物にならない訳
http://nekowarau.seesaa.net/article/424645749.html
xLabeledNode.py
- 同じ形の量産するノードをsubgraphで包んだものをクラス化
- ラベルはsubgraphのラベルを使用する
- ノードの固定属性は、クラス変数とクラスメソッドで制御
- 形やサイズを揃えるのが目的なので、形とサイズが同じ図形ごとに派生する
最新のPython (3.x)をインストールしていれば、graphvizのラッパーは以下のコマンドでインストールできる。
>pip install graphviz
なお、作成したコードは、Atom Editorのatom-runnerをインストールしていれば、alt+r (Windows)で実行できる。
生成されたファイル
- printでコンソールにdotソースコードを出力
- Digraphのsave()でdotソースコードを保存
- Digraphのrender()でdotソースコード/ 指定したグラフィカルフォーマット (pdf/png/svg)を保存
- Digraphのview()でdotソースコード/ 指定したグラフィカルフォーマット (pdf/png/svg)を保存して表示 [render(view=True)と同じ]