ggplot2で図を並べる
〜facetごり押した私とpatchworkとの出会い〜

atusy

2018-10-20

自己紹介

Atusy

  • R一筋5年
    • データ可視化の効率化がきっかけ
    • ggplot2を含めTidyverse歴約3年
  • JuliaとかPythonとかやるやる詐欺してます
  • Tokyo R は #72 以来2回目
  • (株) 蒜山地質年代学研究所
    • 地質試料の化学分析
    • データ解析用Rパッケージ開発

Blog: https://atusy.github.io/blog/

投稿論文がEditor’s choiceになった

ggplot2が沢山並んでるのでチラ見してみてネ (オープンアクセス)

A rapid and precise quantitative electron probe chemical mapping technique and its application to an ultrahigh-pressure eclogite from the Moldanubian Zone of the Bohemian Massif (Nové Dvory, Czech Republic)

Yasumoto et al. develop a new chemical mapping technique that relates mineral-scale compositions (obtained from EMPA) to whole rock compositions. Their model, called QntMap, is applied to a mineralogically layered UHP eclogite (Nové Dvory) from the Czech Republic, previously interpreted as a high-pressure cumulate. Their map of a 3 cm2 area, however, shows that in moving from the garnet- to the pyroxene-rich layer, Cr and Mg# increase in both garnet and pyroxene phases. They conclude that this disequilibrium feature results from a melt (the pyroxenite layer) that was injected into a garnet-rich UHP host. The potential reach goes much further. This research could serve as an excellent tool to evaluate hypotheses of granite emplacement or so-considered fluid-driven alteration within a myriad of settings.

http://www.minsocam.org/MSA/Ammin/AM_Notable_Articles.html

私のggplot2力はこの論文に鍛えられた

色々な図の並べ方

ある変数について集団ごとのヒストグラム

y軸を固定してx軸を変えた散布図

ヒストグラムと散布図

graphics::plotでもできなくはない

今日使うデータセット
mtcars and their friends

Motor Trend Car Road Tests

## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

(Henderson and Velleman, 1981)

?mtcars によると

  • mpg: mile / gallon
  • cyl: シリンダー数
  • disp: 排気量
  • hp: 馬力
  • drat: 後輪車軸比
  • wt: 重量(1000 lbs)
  • qsec: 走行時間(1/4mile)
  • vs: 0 = V型, 1 = 直列
  • am: 0 = オートマ, 1 = マニュアル
  • gear: ギア数
  • carb: キャブレター数

データ整形 (mtcars → minicars)

  • 列選択 (mpg, hp, wt, vs, am)
  • 2値データを文字列に変換 (vs, am)

データ整形 (minicars → longcars)

minicars

mpg wt hp vs am
21.0 2.620 110 V-shaped Manual
21.0 2.875 110 V-shaped Manual
22.8 2.320 93 Straight Manual
21.4 3.215 110 Straight Automatic

longcars

mpg vs am var val
21.0 V-shaped Manual wt 2.620
21.0 V-shaped Manual wt 2.875
22.8 Straight Manual wt 2.320
21.4 Straight Automatic wt 3.215
21.0 V-shaped Manual hp 110.000
21.0 V-shaped Manual hp 110.000
22.8 Straight Manual hp 93.000
21.4 Straight Automatic hp 110.000

tidyr::gather (とspread)

各列の名前をkey列の値に、値をval列にまとめる。
-列名 で、gatherしない変数を指定できる。
spread で戻せる。

wide format
spread(long, key, value)

a x1 x2
a 1 3
b 2 4

long format
gather(wide, key, value, -a)

a key value
a x1 1
b x1 2
a x2 3
b x2 4

longcarsはこんな感じ

Variable Stats / Values Freqs (% of Valid) Missing
mpg [numeric] mean (sd) : 20.09 (5.98) min < med < max : 10.4 < 19.2 < 33.9 IQR (CV) : 7.38 (0.3) 25 distinct values 0 (0%)
vs [character] 1. Straight 2. V-shaped 28 (43.8%) 36 (56.2%) 0 (0%)
am [character] 1. Automatic 2. Manual 38 (59.4%) 26 (40.6%) 0 (0%)
var [character] 1. hp 2. wt 32 (50.0%) 32 (50.0%) 0 (0%)
val [numeric] mean (sd) : 74.95 (86.84) min < med < max : 1.51 < 28.71 < 335 IQR (CV) : 119.62 (1.16) 51 distinct values 0 (0%)

ggplot2基礎

ヒストグラム

散布図

テーマ変更: theme_classic()

テーマ変更: theme_gray()

テーマを更に弄る

?theme 参照……。

facet_grid
注目する変数でグラフを表形式に分割

行で分割する変数 ~ 列で分割する変数

データ整形は大事

V型エンジンのMT車はどれ?

審美的属性 (色や形) での表現も忘れずに

行で分割

列で分割

行内・列内で複数の変数を使った分割も可能

1次元データのグラフでfacet_grid

ヒストグラムを系列ごとに分割

ヒストグラムを変数ごと系列ごとに分割

scales = 'free_x' でx軸の範囲を可変に

直列型はV型より低馬力で軽量

stripの位置をswitch = 'both'

stripを目盛の外側へ

stripの背景をなくす

x軸stripのフォントサイズを変更

x軸のタイトルを消す

一気に

2次元データのグラフでfacet_grid

y軸を固定してx軸を変える

見やすく

図ごとにy軸を表示したい場合はfacet_wrapを使おう

初手に GGally::ggpairs もGOOD

変数が多いと見辛い

facet_wrap
分割したグラフを改行しつつ並べる

~ 分割する変数

列ごとに並べる (dir = 'v')

nrow 引数で行数を制御

ncol 引数で列数を制御

変数が多い時に便利

変数が多いとfacet_gridは辛い

scalesがfreeな軸の目盛は各図に描写

facet_gridは端の図にのみ軸を描写する

facet逆引き

並び順を反転したい (as.table = FALSE)

並び順を制御したい

facetする変数をfactor型にすると、levels順になる。
factorの操作にはforcats パッケージが便利 (参考: ぞうさんの記事)

Tip: 凡例などの順序もfactorで制御できる

stripで図a, b, …したい

facetする変数を予め整形しておく

未分割の図も並べる (margins = TRUE)

facet_grid 専用

未分割の図も並べる (margins = TRUE)

審美的属性にも使う変数でfacetする場合は、
その変数のコピーでfacetする

未分割の図も並べる (data wrangling)

facet_grid でも facet_wrap でも使える

異種の図を並べたい

facet_gridfacet_wrap の引数

目的 facet_grid facet_wrap
facetする変数を指定 rows, cols, facets facets
行数・列数を変える nrow, ncol
軸の範囲を可変にする scales, shrink scales, shrink
図の表示サイズを可変にする space
stripの位置を変更 switch strip.position switch
stripの文字列を変更 labeller labeller
stripの並べ方を変更 as.table as.table, dir
factorでfacetした時データに 含まれない水準を表示する drop drop
分割前の図も並べる margins

赤字 は未紹介・ 打ち消し は Deprecated

patchwork で自由に図を並べる

https://github.com/thomasp85/patchwork

二項演算子を利用して、
ggplot2で作った図を簡単に 継ぎ接ぎ できるパッケージ

参考記事 by かつどんさん (@nozma)
patchworkのREADME邦訳+α
patchwork以外の選択肢

インストール

|で図を横に並べる

/で図を縦に並べる

()でネストする

空白のプロットはplot_spacer()

もうちょっと良いスペーサーが欲しい (xx)

周辺分布なら ggExtra::ggMarginal

全体のテーマを変える

最外ネストのテーマを変える

レイアウトお任せならwrap_plots()

レイアウトお好みでもwrap_plots()

行数や列数、行の高さの比、列の幅の比なども弄れる

|, /, wrap_plots は組み合わせ可能

注釈をつけるにはplot_annotation()

凡例を含む図も綺麗に並べてくれる

多くパッケージで標準的な並べ方

まとめ

使い分けが肝心


データ 図の種類 並べかた 軸の表示
facet_grid 同じ 同じ 表形式 端のみ
facet_wrap 同じ 同じ 改行 scales引数次第
patchwork 自由 自由 自由 全て


Enjoy !