第109回R勉強会@東京(#TokyoR) https://tokyor.connpass.com/event/296561/
第109回 Tokyo.R発表者:das Kino (@kyn02666)1• {cowplot}で複数のグラフを結合する• {ggh4x}でX軸・Y軸のラベルをうまく扱う
View Slide
自己紹介• 仕事:心理学関係の研究を少々• というわけで本トークは、「論文を書くとき」という文脈が強い• これらの本の著者2
今日のトークの背景3友達 私今度、〇〇に論文出そうと思ってひょえー!Figureをgglot2で描きたいんだけど、助けてくれん?ひょえー!
4友達こんなグラフを描いてほしいのだぜ※許可を得たうえで公開※元研究がわからないようデータやラベルは適当
5解説ポイント③ラインを揃える④交互作用のラベルをネストする②空白①枠①軸の目盛を消す②隙間をあける
6ちなみにどれも、英語でググればStack Overflowで答えが見つかりますオレでなきゃ見逃しちゃうね
①軸の目盛を消す / グラフを枠で囲む7目盛を消す枠で囲むとにかく見栄え関係は、theme()をいじれば何とかなる
8fillで塗られるのは、データが描画される領域ではなく、軸部分であることに注意fillしたくなければ、わざわざNAを指定しなくてもよい
②複数のグラフをパネルで並べたときに空白を作る• そもそも、複数のグラフをパネルで並べる方法は?• {patchwork}パッケージ• {cowplot}パッケージ• 他にもあるが、とりわけこれらのパッケージが便利• {patchwork}一択だろうと思っていたが、 {cowplot}が意外と便利だった9
{patchwork}で複数のグラフを並べる• g1, g2, g3がそれぞれggplotオブジェクトのとき10もっと柔軟なレイアウトが可能なので、詳しくは公式Vignetteを参照
11挙動が違うので気を付けて空白を作る{patchwork}の関数(厳密にはempty transparent patch)
{cowplot}で複数のグラフを並べる• g1, g2, g3, g4, g5, g6がそれぞれggplotオブジェクトのとき12r1~r3は行ごとに結合したパネル{patchwork}のplot_spacer()に相当
13引数scaleで、各グラフの倍率を操作可能→ 1未満のscaleを与えることで、結果的にグラフ同士に隙間が生まれる
14③ここのラインを揃えるにはどうすればよい?→ 各行のグラフ数から計算する!!⇒ 2行目、グラフ数2のとき10%小さくなっているので、グラフ数が3なら(1行目)、10 × 32= 15%の縮小
15余談ggplot2自体のtheme()関数を用いると、余白サイズを増やして、それに押しやられるように、グラフエリアを小さくできるただし全体サイズは変化しないので、輪郭を持つ場合にはおそらく使いづらい
④交互作用の要因をネストする16恐らく、ggplot2だけではできない
そもそも交互作用を可視化するには17このようなデータがあるとして
18簡単にできる。ただし2つの要因のラベルがネストされない(右図のようにしたい)
19interaction()を使えば、「要因の全組み合わせ」をX軸にマッピングできるが、今回描きたいグラフはこれではない※interaction()はbaseの関数
余談:interaction()20factor型のベクトルが複数あるとき、それらを組み合わせた1つのベクトルを作る
21マニアックではあるが、中には便利な関数もある
22この部分はlabs()などで書き換えればいい
23解説baseの関数interaction()は、デフォルトでsep = “.”の引数を持つ→ よってスライド19のように、要因が「A.a」「A.b」という風にドットで結合される(もちろん任意のsepを指定してもよい)⇒ それと同じ文字を引数delimに与えると、そこで分離してラベルがネストされる
24X軸とY軸を入れ替える場合、coord_flip()を使う※X軸とY軸にマッピングする変数を入れ替える方法ではおそらく実現不可
25友達 私できたで横線いらんなぁ(こいつほんま…)
26themeの要素を消したければ、とりあえず該当する引数にelement_blank()を与えればよい(スライド7と同様)
27もちろん消すだけでなく、調整もできる
28そんなわけで完成
おまけ:2軸グラフの上手い使い方• 2軸グラフはミスリーディングな場合があるので、一般的に推奨されない• どうしても描きたい場合には、{cowplot}パッケージで手軽に描ける• しかし図のようなグラフを描くとき、2軸グラフを上手く使える29グラフエリア外にテキストを追加しているのがポイント
30secondary Y axisを消している※ 正攻法でやるなら、+ theme(axis.line.y.right = element_blank())secondary Y axisの目盛を、水平線の位置だけに表示させている
31友達 私今度、Tokyo.Rで例のFigureの作り方トークしていい?ぜんぜんいいよーありがとう!ちなみに結局、グラフは1枚ずつ載せることにした後日譚
32これはお前が始めた物語だろ
take home message• Rプログラミングで困ったら、英語でググろう• やはりStack Overflow、 Stack Overflowはすべてを解決する• 公式Vignetteを読み込もう• 痒い所に手が届く事例がたくさんある• 新刊よろしくお願いします• Enjoy!33