tmori3y2のブログ

主にWindowsのプログラムなど

初めてのpython 1: GraphVizでxlabelが使い物にならないのでpythonでヘルパークラスを書いた

xLabelが使い物にならないって?

Digraph (rankdir=‘LR’)で、ラベルより小さな同じサイズのノードを並べたくて、ラベルを外に出すために、xLabel (external label)を指定してみたが、位置を制御できない。

  • ラベルを枠なしのノードにしても良いが、ノードの数が増えすぎてシャレにならなかったし、間隔の制御も難しかった

  • subgraphを使う方法を見つけたが、subgraphを量産するのが面倒

という訳で、「コード生成でしょう!」と普通はなるので、graphvizpython 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)で実行できる。

生成されたファイル

f:id:tmori3y2:20170514132548p:plain

その他、参考にしたサイト

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

devlights.hatenablog.com