diagrammerと仲良くなった話ーグラフィカルモデルのためのdiagrammer速習ー
TRANSCRIPT
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 = ‘θ@^{(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)