{cowplot}で複数のグラフを結合する / {ggh4x}でX 軸・Y 軸のラベルをうまく扱う
by
kyn02666
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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