DiaggrameRと仲良くなった話
ーグラフィカルモデルのためのDiaggrameR速習ー
2017.11.26 Hijiyama.R final
広島大学グローバルキャリアデザインセンター 特別研究員
広島大学大学院 教育学研究科 学習心理学研究室
山根 嵩史
DiagrammeRとは
✔︎ DiagrammeRは,グラフ描画ツールGraphvizを使っ
て,R上で簡単に高度な作図をするパッケージ
(MermaidエンジンやNDFs/EDFsなどの機能も実装されているが今回は割愛)
✔︎ 公式サイトのドキュメントを見てみると夢が広がる
DiagrammeR Docs
(http://rich-iannone.github.io/DiagrammeR/graphviz_and_mermaid.html)
dot言語で色々な作図が可能
(レイアウトは自動!)
ノードの色,形,フォント等の
設定も充実
じゃあこんな図書きたい!
グラフィカルモデルの例
(『実践ベイズモデリング』図15.3)
✔︎ DiagrammeRでグラフィカルモデルが描きたい
グラフィカルモデル (またはプレート表現):
ベイジアンモデリングで使用される,ノードの繋がりで
データの生成過程を視覚的に表現した図
それっぽいコードを書いてみるが…
お,おう...
DiagrammeRと仲良くなりたい
✔︎ DiagrammeRの弱点として,(配置が自動なぶん)
思った通りの図にならないことがある
✔︎ だからといってパワポとかで作図するのも嫌
とくにMacでは
0
1
2
3
4
5
項目 1 項目 2
☞ DiagrammeRと仲良くなりたい
なんで図形とかグラフ要素に
デフォルトで影ついてるの?
BKなの?Sぬの?
DiagrammeRの記法
✔︎ graph[],node[],edge[]の部分に分けて書く
graph[]:配置の方向や背景など,グラフ全体の設定
node[]:配置したいノード名とノードの設定
edge[]:ノード間をつなぐエッジの設定
✔︎ それぞれのノード,エッジの後ろに[]をつければ
個別に設定も可能
配置に関するコマンド
✔︎ ノードの位置を調整したい
edge[]内で{rank = }で設定
{rank = same; a; b} → ノードaとbを同じ階層に配置
{rank = max; a} → ノードaを一番下の階層に配置
{rank = min; a} → ノードaを一番上の階層に配置
✔︎ 図の形状について
階層型 (dot) の他に,円形 (circo) や
ネットワーク型 (neato) なども
graph[]内で“layout = 〜”で設定
デフォルトはdot
✔︎ 横向きの図にしたい
graph[]内で“rankdir = LR”で設定
描画に関するコマンド
✔︎ ギリシャ文字を使いたい
&文字列; で任意のギリシャ文字を描ける
✔︎ 上付き,下付き文字にしたい
@^{文字列}で上付き文字
@_{文字列}で下付き文字
✔︎ イタリックにしたい
graph[]内で“fontname = 〜”で斜体フォントを設定
ラベルの一部だけ斜体にしたい場合には <<I>文字列</I>>
先ほどのコードを修正すると…
fixedsize = true
☞ 各ノードの大きさを固定
fontname = ‘Times-italic’
☞ フォント名と斜体の設定
label = ‘&theta;@^{(h)}’
☞ ギリシャ文字θと
上付き文字の設定
{rank = max; ns; nn}
☞ nsとnnのノードを一番下に配置
するため,{rank = } を使用
できた!
subgraphの設定
✔︎ subgraph cluster{} で
枠付きのサブグラフ作成
✔︎ サブグラフの外と中で
ノードの位置を揃えたい
ときは,graph[]内で
“newrank = true”の設定
が必要
仲良くなれなかった点
✔︎ ︎一部が重なったsubgraphは描けない
例:『実践ベイズモデリング』 図18.9
✔︎ ︎graphvizの仕様上無理っぽい
背景透明色で作った2つのサブグラフを重ね合わせ
るとかどうですか。ダメですか。
参照:https://stackoverflow.com/questions/12680865/how-to-draw-overlapping-clusters-in-graphviz
参考にしたサイトなど
Graphvizとdot言語でグラフを描く方法のまとめ
(https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d)
Node, Edge and Graph Attributes
(http://www.graphviz.org/doc/info/attrs.html)
DiagrammeR入門 nodeの属性まとめ
(https://qiita.com/kazutan/items/feea8a3d40143f1f7978)
Rでグラフィカルモデルを書こう!
(https://kunisatolab.github.io/how-to-graphicalModel.html)
Plate notation via Graphviz/Rstudio
(http://kosugitti.net/archives/5834)
dot(graphviz)でsubgraph間の位置関係を整える
(http://blog.livedoor.jp/hiroaki8270/archives/17759669.html)

DiagrammeRと仲良くなった話ーグラフィカルモデルのためのDiagrammeR速習ー