昨日、Blogger の歴史年表を描くのに graphviz のドキュメントを読んでいたら、画像を埋め込む方法を見つけた。
サンプル
画面遷移のサンプルを描いてみた。まずは実行例とソースコードをばご覧あれ。
Ubuntu で slapd をインストールする時の設定画面の画面遷移。
digraph G {
node [shape=plaintext];
slapd1 [label=<<table><tr><td><img src="s1.png"/></td></tr></table>>];
slapd2 [label=<<table><tr><td><img src="s2.png"/></td></tr></table>>];
slapd3 [label=<<table><tr><td><img src="s3.png"/></td></tr></table>>];
slapd4 [label=<<table><tr><td><img src="s4.png"/></td></tr></table>>];
slapd1 -> slapd2 -> slapd3 -> slapd4;
}
s1.png から s4.png まで、4 枚の画像を用意してある。
解説
gnaphviz では、label の指定に HTML ライクな書式が使える。使える要素は、table, br, font, img の 4 つ。これを " ではなく < と > で囲む。
例えば、
foo [label="foo\nbar"]
をこの書式で書くと、次のやうになる:
foo [label=<foo<br/>bar>]
茶目っ気を出して、ラベルの中で色を変えることも可能。
foo [label=<<font color="blue">foo</font><br/><font color="red">bar</font>>]
table, br, font はどこででも書けるけど、img 要素は table の中でしか書けない。table の中では tr, td 要素を使うことができる。なので画像を貼る最小のコードは次のやうになる。
hoge [label=<<table><tr><td><img src="hoge.png"/></td></tr></table>>];
img 要素の属性は src と scale の 2 つのみ。HTML の alt 属性はない。
scale 属性は table のセルに余分なスペースがある時の振る舞いを決定する。属性値は次の通り:
- false (default): 何もしない。そのままのサイズを維持。
- true: 画像を一様に合わせるように (uniformly to fit) 拡大。
- width: 画像を幅に合わせて拡大
- height: 画像を高さに合わせて拡大
- both: 画像を幅と高さに合わせて拡大
最後に、node に label を付ける際はサンプルのやうに node [shape=plaintext];
を付けるといい。そうしないと、画像の周りに円が描かれてしまう。