Upgrade to Pro — share decks privately, control downloads, hide ads and more …

{cowplot}で複数のグラフを結合する / {ggh4x}でX 軸・Y 軸のラベルをうまく扱う

kyn02666
October 06, 2023

{cowplot}で複数のグラフを結合する / {ggh4x}でX 軸・Y 軸のラベルをうまく扱う

第109回R勉強会@東京(#TokyoR)
https://tokyor.connpass.com/event/296561/

kyn02666

October 06, 2023
Tweet

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. 28
    そんなわけで完成

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide