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
kyn02666
October 06, 2023
Programming
0
2.3k
{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
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
170
オープンソースソフトウェアへの解像度🔬
utam0k
13
2.6k
Software Architecture
hschwentner
6
2.3k
Your Perfect Project Setup for Angular @BASTA! 2025 in Mainz
manfredsteyer
PRO
0
170
Swift Concurrency - 状態監視の罠
objectiveaudio
2
510
開発生産性を上げるための生成AI活用術
starfish719
3
460
Django Ninja による API 開発効率化とリプレースの実践
kashewnuts
0
1.3k
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
230
Devvox Belgium - Agentic AI Patterns
kdubois
1
120
階層構造を表現するデータ構造とリファクタリング 〜1年で10倍成長したプロダクトの変化と課題〜
yuhisatoxxx
3
1k
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
150
そのpreloadは必要?見過ごされたpreloadが技術的負債として爆発した日
mugitti9
2
3.3k
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Rails Girls Zürich Keynote
gr2m
95
14k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
369
20k
Six Lessons from altMBA
skipperchong
28
4k
For a Future-Friendly Web
brad_frost
180
9.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
It's Worth the Effort
3n
187
28k
Visualization
eitanlees
149
16k
Scaling GitHub
holman
463
140k
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