ダイアグラム

概念を整理するときなどに,フローチャートやネットワーク図といったダイアグラムを描きたくなることがあるだろう。 このとき,ダイアグラムを効率的に描くツールはなかなか見当たらないのではないだろうか。

現状では,OmniGraffleを使うのが一番よい選択肢である。 ワードアートは使いたくない。 ただし,OmniGraffleはAdobe Illustratorのお手軽版という位置づけであり,より汎用的なイラスト制作ツールのひとつとして位置づけられる。 このため,ダイアグラム作成ツールに,そこまで多様な機能は求めていないし,そうした柔軟性のせいでかえって面倒に感じる。 個人的には,デザインを決めなければならないことが億劫である。 また,いずれのソフトウェアも描きたい対象の構造を理解しながら,ノードやエッジに意味を持たせたダイアグラムを描くには不向きである

こうした不満を解消してくれるツールにGraphvizがある。 Graphvizは,DOT言語で記述されたグラフ構造を描画するためのツールである。 ノードとエッジを定義するだけで,自動で最適なレイアウトを考えてくれる。 同様のツールに,Mermaidがある。

ここでは,Graphvizを使って農協の全国組織の図を作成することにする。

1 Graphvizのインストール

macOSの場合,Terminalに以下のコマンドを打ち込むことで,Homebrewを使ってインストールできる。

$ brew install graphviz

Windowsの場合は,以下から最新の64-bit版をダウンロードして,インストールする。

ノートGraphviz

2 農協の全国組織

DOT言語とGraphviz属性について知りたい場合は,Graphvizとdot言語でグラフを描く方法のまとめ - QiitaDiagrammeR 〜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

ja1 cluster1 都道府県段階 cluster0 全国段階 組合員 組合員 JA(単協) JA(単協) 組合員->JA(単協) JA経済連 JA経済連 JA(単協)->JA経済連 JA共済連 JA共済連 JA(単協)->JA共済連 JA信連 JA信連 JA(単協)->JA信連 JA都道府県中央会 JA都道府県中央会 JA(単協)->JA都道府県中央会 JA経済連->JA都道府県中央会 JA全農 JA全農 JA経済連->JA全農 JA共済連->JA都道府県中央会 JA全共連 JA全共連 JA共済連->JA全共連 JA信連->JA都道府県中央会 農林中金 農林中金 JA信連->農林中金 JA全中 JA全中 JA都道府県中央会->JA全中 JA全農->JA全中 JA全共連->JA全中 農林中金->JA全中

それぞれの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のようにclusterrankといった高度なレイアウト機能はサポートしていない。

3 1県1農協を踏まえた農協の全国組織

現在,農協合併が進んで1県1農協となることにより,都道府県段階の農協が存在しない場合がある。 このことを踏まえると,図は以下のように表現できる。

ja2 cluster1 都道府県段階 cluster0 全国段階 組合員 組合員 JA(単協) JA(単協) 組合員->JA(単協) JA共済連 JA共済連 JA(単協)->JA共済連 JA都道府県中央会 JA都道府県中央会 JA(単協)->JA都道府県中央会 JA経済連 JA経済連 JA(単協)->JA経済連 JA信連 JA信連 JA(単協)->JA信連 JA全中 JA全中 JA共済連->JA全中 JA都道府県中央会->JA全中 JA全農 JA全農 JA全農->JA全中 農林中金 農林中金 農林中金->JA全中 JA経済連->JA都道府県中央会 JA経済連->JA全農 JA信連->JA都道府県中央会 JA信連->農林中金

この図のソースコードは掲載しないので,各自で考えてほしい。

先ほどの図と比べると,中央会の位置が微妙なところに来てしまっている。 これらノードの位置は自動で決まるため,細かな調整はできない。 こうした調整をしないと割り切ることがGraphvizの使用にあたって必要な心構えとなる。 もし細部までこだわりたいのであれば,OmniGraffleやAdobe Illustratorを使えばよい。 ただし,この図に限って言えば,中央会に向かうエッジを減らすと一応改善される。

ja cluster1 都道府県段階 cluster0 全国段階 組合員 組合員 JA(単協) JA(単協) 組合員->JA(単協) JA共済連 JA共済連 JA(単協)->JA共済連 JA都道府県中央会 JA都道府県中央会 JA(単協)->JA都道府県中央会 JA経済連 JA経済連 JA(単協)->JA経済連 JA信連 JA信連 JA(単協)->JA信連 JA全中 JA全中 JA都道府県中央会->JA全中 JA全農 JA全農 農林中金 農林中金 JA経済連->JA全農 JA信連->農林中金

この図に,JAバンクを枠で囲みたいと思っても,このままではうまくいかない。 同じノードに2つ以上のsubgraphを設定できないためである。 こうした複雑な図は,Graphvizの将来のアップデートにより対応可能となるかもしれない。 現時点では,多少の工夫により,以下のような図を描くことができる。

ja cluster1 都道府県段階 cluster0 全国段階 組合員 組合員 JA(単協) JA(単協) 組合員->JA(単協) JA共済連 JA共済連 JA(単協)->JA共済連 JA都道府県中央会 JA都道府県中央会 JA(単協)->JA都道府県中央会 JA経済連 JA経済連 JA(単協)->JA経済連 JA信連 JA信連 JA(単協)->JA信連 JA全中 JA全中 JA都道府県中央会->JA全中 JA全農 JA全農 農林中金 農林中金 JA経済連->JA全農 JA信連->農林中金