ダイアグラム
概念を整理するときなどに,フローチャートやネットワーク図といったダイアグラムを描きたくなることがあるだろう。 このとき,ダイアグラムを効率的に描くツールはなかなか見当たらないのではないだろうか。
現状では,OmniGraffleを使うのが一番よい選択肢である。 ワードアートは使いたくない。 ただし,OmniGraffleはAdobe Illustratorのお手軽版という位置づけであり,より汎用的なイラスト制作ツールのひとつとして位置づけられる。 このため,ダイアグラム作成ツールに,そこまで多様な機能は求めていないし,そうした柔軟性のせいでかえって面倒に感じる。 個人的には,デザインを決めなければならないことが億劫である。 また,いずれのソフトウェアも描きたい対象の構造を理解しながら,ノードやエッジに意味を持たせたダイアグラムを描くには不向きである
こうした不満を解消してくれるツールにGraphvizがある。 Graphvizは,DOT言語で記述されたグラフ構造を描画するためのツールである。 ノードとエッジを定義するだけで,自動で最適なレイアウトを考えてくれる。 同様のツールに,Mermaidがある。
ここでは,Graphvizを使って農協の全国組織の図を作成することにする。
1 Graphvizのインストール
macOSの場合,Terminalに以下のコマンドを打ち込むことで,Homebrewを使ってインストールできる。
$ brew install graphviz
Windowsの場合は,以下から最新の64-bit版をダウンロードして,インストールする。
2 農協の全国組織
DOT言語とGraphviz属性について知りたい場合は,Graphvizとdot言語でグラフを描く方法のまとめ - QiitaやDiagrammeR 〜RでGraphvizを使う~ - R言語による電子カルテデータの二次利用などを参照するとよい。
細かい説明抜きに,農協の全国組織をGraphvizで書くと,以下のようになる(もっとセミコロンで区切った方が見やすいかもしれない)。
digraph ja1 {
graph [rankdir = LR]
node [fontname = Helvetica,
shape = box,
fixedsize = false,
style = filled,
fillcolor = white]
組合員 [shape = circle, width = 0.9]
JA(単協)
node [width = 2.2]
JA経済連; JA共済連; JA信連; JA都道府県中央会; JA全農; JA全共連; 農林中金; JA全中
edge []
組合員 -> JA(単協)
JA(単協) -> JA経済連 -> JA全農
JA(単協) -> JA共済連 -> JA全共連
JA(単協) -> JA信連 -> 農林中金
JA(単協) -> JA都道府県中央会 -> JA全中
JA経済連 -> JA都道府県中央会
JA共済連 -> JA都道府県中央会
JA信連 -> JA都道府県中央会
JA全農 -> JA全中
JA全共連 -> JA全中
農林中金 -> JA全中
subgraph cluster1 {
label = "都道府県段階"
fontname = Helvetica
bgcolor = ivory
style = rounded
{rank = same; JA経済連; JA共済連; JA信連; JA都道府県中央会}
}
subgraph cluster0 {
label = "全国段階"
fontname = Helvetica
bgcolor = honeydew
style = rounded
{rank = same; JA全農; JA全共連; 農林中金; JA全中}
}
}
これを,任意のテキストエディタにコピー&ペーストして,ja1.gvというファイル名で保存しておく。 DOT言語の拡張子としては,.dotあるいは.gvが使われる。 前者はMicrosoft Wordのテンプレートファイルとして用いられており,OSがこの拡張子のついたファイルを自動的にWordと関連付けてしまうため,後者を使うことにする。
Terminalで以下のように打ち込むと,必要なPDFファイルが得られる。
$ dot -Tpdf ja1.gv > ja1.pdf
それぞれのsubgraph内で中央会に向かうエッジを描いているため,若干複雑になっている。 系統組織であることを表現するにあたって,これらのエッジは不要かもしれない。
もしTerminalがよくわからない場合は,RStudioを使うか,GraphvizOnlineを使うと便利である。
同様のことは,DiagrammeRを用いて,Rからを実行することもできる。
2.1 RによるGraphvizの処理
Rで実行するには以下のようにする。
library(DiagrammeR)
graph <- DiagrammeR::grViz(diagram = "ja1.gv")PDFで保存したい場合は,以下のようにする。
DiagrammeR::export_graph(graph, file_name = "ja1.pdf")この方法でうまくいくはずであるが,なぜかエラーが出てしまい,解決策がわからない。 ひとまず,Rは使わずに,TerminalからPDFファイルを出力する。 あるいは,RStudioで graph と入力して図を表示してから,図のパネルのExportからPNGファイルで保存する(ただし,この方法は本質的な解決策ではないため,非推奨である)。
2.2 PythonによるGraphvizの処理
一方,Pythonで実行するには以下のようにする。
from graphviz import Source
with open("../Graphviz/ja1.gv", "r") as file:
dot_string = file.read()
source = Source(dot_string, format="pdf")
source.render(filename="../fig/ja1_python", cleanup=True)なお,Google Colabを使う場合,JA(単協)のようにするとエラーの原因になることがあるため,"JA(単協)"とダブルクォーテーションで括った方が無難である。 ただし,現時点では,Google Colab上のGraphvizで日本語のフォントの入った出力を正しく得ることは困難なようである。
2.3 Mermaid
ちなみに,上の図をMermaidで描くと次のようになる。
flowchart LR 組合員(組合員) --> JA(JA) JA --> JA経済連 JA経済連 --> JA全農 JA --> JA共済連 JA共済連 --> JA全共連 JA --> JA信連 JA信連 --> 農林中金 JA --> JA都道府県中央会 JA都道府県中央会 --> JA全中
MermaidはGraphvizのようにclusterやrankといった高度なレイアウト機能はサポートしていない。
3 1県1農協を踏まえた農協の全国組織
現在,農協合併が進んで1県1農協となることにより,都道府県段階の農協が存在しない場合がある。 このことを踏まえると,図は以下のように表現できる。
この図のソースコードは掲載しないので,各自で考えてほしい。
先ほどの図と比べると,中央会の位置が微妙なところに来てしまっている。 これらノードの位置は自動で決まるため,細かな調整はできない。 こうした調整をしないと割り切ることがGraphvizの使用にあたって必要な心構えとなる。 もし細部までこだわりたいのであれば,OmniGraffleやAdobe Illustratorを使えばよい。 ただし,この図に限って言えば,中央会に向かうエッジを減らすと一応改善される。
この図に,JAバンクを枠で囲みたいと思っても,このままではうまくいかない。 同じノードに2つ以上のsubgraphを設定できないためである。 こうした複雑な図は,Graphvizの将来のアップデートにより対応可能となるかもしれない。 現時点では,多少の工夫により,以下のような図を描くことができる。