TikZのgraph記法とgraph drawing

TeX & LaTeX Advent Calendar 2018の21日目です.昨日はisaribi_saitohさん,明日はzr_tex8rさんです.

TikZはLaTeX上で図を描く有名ライブラリです.Tikzの大半の機能はどのTeXエンジンでも使えます*1 が,実はLuaTeXでしか使えないTikZライブラリがあるのをご存知でしょうか・・・?それが今日のテーマ,graph drawingです.

Graph drawingはグラフ(折れ線グラフ等の統計で出てくる「グラフ」ではなく,頂点と辺があるグラフ理論の方の「グラフ」)をいい感じに描画するアルゴリズムのことです.数値計算が必要なので,TeX言語ではなくLuaで実装されているようです.ちなみにライブラリ作者はTikZやbeamerの作者のTill Tantauです.

TikZで大変な部分の大半は,長大なマニュアルを読むところと座標をポチポチ指定するところだと思うのですが,graph drawingはその片方を自動化してくれるのですごい*2

graph記法

TikZにはグラフを簡単に記述するためのgraph記法がありますので,まずはそのおさらいから始めましょう.graph記法はgraphsライブラリを読み込むと使えるようになります.

\usetikzlibrary{graphs}

graph記法は,TikZのnodeやpathを簡易的に記述できるようにしたものです.たとえば,4頂点からなるグラフは次のように書けます.

\tikzset{my node/.style={circle,fill=blue!10,inner sep=0pt}}
\begin{tikzpicture}
    \graph[nodes={my node}]{
    1 -> {2, 3} -> 4
    };
\end{tikzpicture}


graphに頂点の名前を指定するだけで,対応するTikZのnodeが自動的に作られていることに注意してください.

デフォルトの配置はそこそこいい感じです.が,これが気に食わない場合はnodeの座標を手動で入力できます.no placementオプションをつけて,TikZ側のレイアウト機能を無効にしておく必要があります.

\graph[nodes={my node},no placement]{
    1[at={(0,0)}] -> {2[at={(1,1)}], 3[at={(1,-1)}]} -> 4[at={(2,0)}]
};

また,よく使うグラフはgraphs.standardライブラリ*3に用意してあるので,subgraphコマンドで呼び出して使えます.

\graph[nodes={my node}]{
    subgraph K_n[n=5,clockwise]
};


ここで clockwise オプションは,nodeを時計回りに等間隔で配置するというオプションです.graph記法では簡単な配置オプションのみが用意されています.これらはLuaTeX以外のTeXエンジンでも使えますが,非常に簡単な配置しかできません.

graph drawing

さて,graph記法を使うとグラフが簡単に描けるのはいいのですが,nodeの配置が大変です.手で座標指定できるうちはいいですが,node数が多くなってくると苦痛ですね.graph drawingを使うと「いい感じ」に頂点を配置してくれます.graph drawingライブラリは,個別にグラフ描画用の子ライブラリを持っているので,それと一緒に読み込みます:

\usetikzlibrary{graphs,graphs.standard,graphdrawing}
\usegdlibrary{trees,force,layered} %graphdrawingの子ライブラリ
Forceレイアウト

最もポピュラーなのが,物理的なアイデアでグラフ描画する方法です.例えば,各頂点を反発し合う粒子,枝をバネだと思った力学系の平衡状態が「いい感じ」の配置だと思うことができます.この方法は,頂点同士に特別な構造のないグラフに向いています.使い方は,spring layoutを\graphのオプションに指定するだけです.

\graph[spring layout,nodes={my node}]{
    1 -> {2, 3} -> 4
};

けっこう複雑なグラフもいけます:

Petersenグラフはイマイチでした.特別な構造のあるグラフにはあまり向いていないようです:

Layeredレイアウト

フローチャートのように階層構造があるグラフにはlayered layoutが向いています.今回は,youkoseki.com | 「それが大事」の状態遷移図 から大事MANブラザーズバンド「それが大事」の歌詞グラフをお借りして描画してみました.けっこう大きなグラフですが,割と簡単に配置してくれます.

Treeレイアウト

木構造を描きたい場合はtree layoutが使えます.せっかくなので,雪だるまで(クリスマス?)ツリーを描いてみました:

graph記法とgraph drawing,なかなか広まっていないようですが,使ってみると非常に便利でTikZが捗ります.というわけで,来年もTikZをやっていきましょう💪

今回の記事のサンプルコードは以下のリンクで見ることができます.
v2.overleaf.com

*1:ただしdvipdfmx周りで厄介なことが起こることがあります: cf.TikZ は dvipdfmx をどこまでサポートするか? (1) - マクロツイーター

*2:もう片方はどうにもならない😂

*3:PGF/TikZマニュアルだと何故か graph.standard になっているが,間違い!TikZマニュアルを信用してはいけない💀

『HUGっと!プリキュア LIVE FOR YOU!!』に行ってきた

昨年に引き続き,今年もプリキュアライブをやるというので行ってきました!今年はチケット倍率が高かったのか,昼の部のみの参戦.

www.marv.jp

昨年の記事はこちら
tasusu.hatenablog.com

今年の会場は品川プリンスステラボール.前回のかつしかシンフォニーヒルズに比べてやや規模が大きい気がしますが,会場規模が公開されてないので謎.昨年は親子で席が分かれていない問題がありましたが,今年は「指定席」「スタンディング」「親子席」と住み分けがなされ,スタンディングも男女別になっていました.運営GJ.

prehyou2015.hatenablog.com


昨年いいなと思った,入場者限の物販は今年もあったので,タオルを買いました.今年のタオルはかっこいいので,他のライブでも普通に使えそう(生地の吸水性はよくないですが).Tシャツはやはり人気なのか,入場時には既に売り切れていました.

今年もボーカルアルバムとシングルからかな?と思っていたのですが,予想以上に初披露曲が多くて驚きました!特に五條さんのDANZENの15周年アレンジ,歴代のシリーズ名が歌詞に入っていてアツい!twitterの感想:


客層は前回と同じく大人9割前後だと思うのですが,今年は親子席ができたので子どもの存在感がかなりありました.小さい子のライブコールを聞くのは貴重な機会かもしれないw

そして,ライブ最後になんと15周年ライブの開催が告知!貴重なプリキュアライブが年明けからあるなんて,最高すぎる・・・.これはなんとしても行きたい!
www.marv.jp
プリキュアライブも毎年続けて,15周年イベントで終わることなくTVシリーズとともに歴史を刻んでいってほしいですね.