Slide 1

Slide 1 text

第109回 Tokyo.R 発表者:das Kino (@kyn02666) 1 • {cowplot}で複数のグラフを結合する • {ggh4x}でX軸・Y軸のラベルをうまく扱う

Slide 2

Slide 2 text

自己紹介 • 仕事:心理学関係の研究を少々 • というわけで本トークは、「論文を書くとき」という文脈が強い • これらの本の著者 2

Slide 3

Slide 3 text

今日のトークの背景 3 友達 私 今度、〇〇に 論文出そうと思って ひょえー! Figureをgglot2で 描きたいんだけど、 助けてくれん? ひょえー!

Slide 4

Slide 4 text

4 友達 こんなグラフを 描いてほしいのだぜ ※許可を得たうえで公開 ※元研究がわからないよう データやラベルは適当

Slide 5

Slide 5 text

5 解説ポイント ③ラインを揃える ④交互作用のラベルを ネストする ②空白 ①枠 ①軸の目盛を消す ②隙間を あける

Slide 6

Slide 6 text

6 ちなみにどれも、英語でググれば Stack Overflowで答えが見つかります オレでなきゃ見逃しちゃうね

Slide 7

Slide 7 text

①軸の目盛を消す / グラフを枠で囲む 7 目盛を消す 枠で囲む とにかく見栄え関係は、theme()をいじれば何とかなる

Slide 8

Slide 8 text

8 fillで塗られるのは、 データが描画される領域ではなく、 軸部分であることに注意 fillしたくなければ、わざわざNAを指定しなくてもよい

Slide 9

Slide 9 text

②複数のグラフをパネルで並べたときに 空白を作る • そもそも、複数のグラフをパネルで並べる方法は? • {patchwork}パッケージ • {cowplot}パッケージ • 他にもあるが、とりわけこれらのパッケージが便利 • {patchwork}一択だろうと思っていたが、 {cowplot}が意外と便利だった 9

Slide 10

Slide 10 text

{patchwork}で複数のグラフを並べる • g1, g2, g3がそれぞれggplotオブジェクトのとき 10 もっと柔軟なレイアウトが可能なので、詳しくは公式Vignetteを参照

Slide 11

Slide 11 text

11 挙動が違うので気を付けて 空白を作る{patchwork}の関数 (厳密にはempty transparent patch)

Slide 12

Slide 12 text

{cowplot}で複数のグラフを並べる • g1, g2, g3, g4, g5, g6がそれぞれggplotオブジェクトのとき 12 r1~r3は行ごとに結合したパネル {patchwork}のplot_spacer()に相当

Slide 13

Slide 13 text

13 引数scaleで、各グラフの倍率を操作可能 → 1未満のscaleを与えることで、 結果的にグラフ同士に隙間が生まれる

Slide 14

Slide 14 text

14 ③ここのラインを揃えるにはどうすればよい? → 各行のグラフ数から計算する!! ⇒ 2行目、グラフ数2のとき10%小さくなっているので、 グラフ数が3なら(1行目)、10 × 3 2 = 15%の縮小

Slide 15

Slide 15 text

15 余談 ggplot2自体のtheme()関数を用いると、 余白サイズを増やして、 それに押しやられるように、 グラフエリアを小さくできる ただし全体サイズは変化しないので、 輪郭を持つ場合にはおそらく使いづらい

Slide 16

Slide 16 text

④交互作用の要因をネストする 16 恐らく、ggplot2だけではできない

Slide 17

Slide 17 text

そもそも交互作用を可視化するには 17 このようなデータがあるとして

Slide 18

Slide 18 text

18 簡単にできる。 ただし2つの要因のラベルがネストされない (右図のようにしたい)

Slide 19

Slide 19 text

19 interaction()を使えば、 「要因の全組み合わせ」を X軸にマッピングできるが、 今回描きたいグラフはこれではない ※interaction()はbaseの関数

Slide 20

Slide 20 text

余談:interaction() 20 factor型のベクトルが複数あるとき、それらを組み合わせた1つのベクトルを作る

Slide 21

Slide 21 text

21 マニアックではあるが、中には便利な関数もある

Slide 22

Slide 22 text

22 この部分はlabs()などで 書き換えればいい

Slide 23

Slide 23 text

23 解説 baseの関数interaction()は、デフォルトでsep = “.”の引数を持つ → よってスライド19のように、要因が「A.a」「A.b」という風にドットで結合される (もちろん任意のsepを指定してもよい) ⇒ それと同じ文字を引数delimに与えると、そこで分離してラベルがネストされる

Slide 24

Slide 24 text

24 X軸とY軸を入れ替える場合、 coord_flip()を使う ※X軸とY軸にマッピングする変数を 入れ替える方法ではおそらく実現不可

Slide 25

Slide 25 text

25 友達 私 できたで 横線いらんなぁ (こいつほんま…)

Slide 26

Slide 26 text

26 themeの要素を消したければ、 とりあえず該当する引数に element_blank()を与えればよい (スライド7と同様)

Slide 27

Slide 27 text

27 もちろん消すだけでなく、調整もできる

Slide 28

Slide 28 text

28 そんなわけで完成

Slide 29

Slide 29 text

おまけ:2軸グラフの上手い使い方 • 2軸グラフはミスリーディングな場合があるので、一般的に推奨されない • どうしても描きたい場合には、{cowplot}パッケージで手軽に描ける • しかし図のようなグラフを描くとき、2軸グラフを上手く使える 29 グラフエリア外にテキストを 追加しているのがポイント

Slide 30

Slide 30 text

30 secondary Y axisを消している ※ 正攻法でやるなら、 + theme(axis.line.y.right = element_blank()) secondary Y axisの目盛を、水平線の位置だけに表示させている

Slide 31

Slide 31 text

31 友達 私 今度、Tokyo.Rで 例のFigureの作り方 トークしていい? ぜんぜんいいよー ありがとう! ちなみに結局、 グラフは1枚ずつ 載せることにした 後日譚

Slide 32

Slide 32 text

32 これはお前が始めた物語だろ

Slide 33

Slide 33 text

take home message • Rプログラミングで困ったら、英語でググろう • やはりStack Overflow、 Stack Overflowはすべてを解決する • 公式Vignetteを読み込もう • 痒い所に手が届く事例がたくさんある • 新刊よろしくお願いします • Enjoy! 33