Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
{cowplot}で複数のグラフを結合する / {ggh4x}でX 軸・Y 軸のラベルをうまく扱う
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kyn02666
October 06, 2023
Programming
0
2.7k
{cowplot}で複数のグラフを結合する / {ggh4x}でX 軸・Y 軸のラベルをうまく扱う
第109回R勉強会@東京(#TokyoR)
https://tokyor.connpass.com/event/296561/
kyn02666
October 06, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
610
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
6
2.2k
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
8.2k
エラーログのマスキングの仕組みづくりに役立ったASTの話
kumoichi
0
250
条件判定に名前、つけてますか? #phperkaigi #c
77web
1
260
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
160
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
460
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
220
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
750
AI活用のコスパを最大化する方法
ochtum
0
230
RAGでハマりがちな"Excelの罠"を、データの構造化で突破する
harumiweb
9
2.9k
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
120
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
310
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
290
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
150
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
A better future with KSS
kneath
240
18k
The SEO identity crisis: Don't let AI make you average
varn
0
420
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
220
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
78
Transcript
第109回 Tokyo.R 発表者:das Kino (@kyn02666) 1 • {cowplot}で複数のグラフを結合する • {ggh4x}でX軸・Y軸のラベルをうまく扱う
自己紹介 • 仕事:心理学関係の研究を少々 • というわけで本トークは、「論文を書くとき」という文脈が強い • これらの本の著者 2
今日のトークの背景 3 友達 私 今度、〇〇に 論文出そうと思って ひょえー! Figureをgglot2で 描きたいんだけど、 助けてくれん?
ひょえー!
4 友達 こんなグラフを 描いてほしいのだぜ ※許可を得たうえで公開 ※元研究がわからないよう データやラベルは適当
5 解説ポイント ③ラインを揃える ④交互作用のラベルを ネストする ②空白 ①枠 ①軸の目盛を消す ②隙間を あける
6 ちなみにどれも、英語でググれば Stack Overflowで答えが見つかります オレでなきゃ見逃しちゃうね
①軸の目盛を消す / グラフを枠で囲む 7 目盛を消す 枠で囲む とにかく見栄え関係は、theme()をいじれば何とかなる
8 fillで塗られるのは、 データが描画される領域ではなく、 軸部分であることに注意 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オブジェクトのとき 12 r1~r3は行ごとに結合したパネル
{patchwork}のplot_spacer()に相当
13 引数scaleで、各グラフの倍率を操作可能 → 1未満のscaleを与えることで、 結果的にグラフ同士に隙間が生まれる
14 ③ここのラインを揃えるにはどうすればよい? → 各行のグラフ数から計算する!! ⇒ 2行目、グラフ数2のとき10%小さくなっているので、 グラフ数が3なら(1行目)、10 × 3 2
= 15%の縮小
15 余談 ggplot2自体のtheme()関数を用いると、 余白サイズを増やして、 それに押しやられるように、 グラフエリアを小さくできる ただし全体サイズは変化しないので、 輪郭を持つ場合にはおそらく使いづらい
④交互作用の要因をネストする 16 恐らく、ggplot2だけではできない
そもそも交互作用を可視化するには 17 このようなデータがあるとして
18 簡単にできる。 ただし2つの要因のラベルがネストされない (右図のようにしたい)
19 interaction()を使えば、 「要因の全組み合わせ」を X軸にマッピングできるが、 今回描きたいグラフはこれではない ※interaction()はbaseの関数
余談:interaction() 20 factor型のベクトルが複数あるとき、それらを組み合わせた1つのベクトルを作る
21 マニアックではあるが、中には便利な関数もある
22 この部分はlabs()などで 書き換えればいい
23 解説 baseの関数interaction()は、デフォルトでsep = “.”の引数を持つ → よってスライド19のように、要因が「A.a」「A.b」という風にドットで結合される (もちろん任意のsepを指定してもよい) ⇒ それと同じ文字を引数delimに与えると、そこで分離してラベルがネストされる
24 X軸とY軸を入れ替える場合、 coord_flip()を使う ※X軸とY軸にマッピングする変数を 入れ替える方法ではおそらく実現不可
25 友達 私 できたで 横線いらんなぁ (こいつほんま…)
26 themeの要素を消したければ、 とりあえず該当する引数に element_blank()を与えればよい (スライド7と同様)
27 もちろん消すだけでなく、調整もできる
28 そんなわけで完成
おまけ:2軸グラフの上手い使い方 • 2軸グラフはミスリーディングな場合があるので、一般的に推奨されない • どうしても描きたい場合には、{cowplot}パッケージで手軽に描ける • しかし図のようなグラフを描くとき、2軸グラフを上手く使える 29 グラフエリア外にテキストを 追加しているのがポイント
30 secondary 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