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

13
DiaggrameRと仲良くなった話 ーグラフィカルモデルのためのDiaggrameR速習ー 2017.11.26 Hijiyama.R final 広島大学グローバルキャリアデザインセンター 特別研究員 広島大学大学院 教育学研究科 学習心理学研究室 山根 嵩史

Upload: takashi-yamane

Post on 21-Jan-2018

533 views

Category:

Data & Analytics


2 download

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 = ‘&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)