まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

ggforce::facet_matrixを用いてfacet_grid(c(A,B,C) ~ c(D,E))的な表現を実現する

以下のツイートを見かけたので試してみた記事。

ドキュメント的にはこれ。

https://cran.r-project.org/web/packages/ggforce/ggforce.pdf

使い方

ドキュメントのサンプルコードを使う。まずは基本的なやつ。

library(ggforce)
library(tidyverse)

# Standard use:
ggplot(mpg) +
  geom_point(aes(x = .panel_x, y = .panel_y)) +
  facet_matrix(vars(displ, cty, hwy))

f:id:chito_ng:20190812203928p:plain

facet_matrixを使うときは、aesaes(x = .panel_x, y = .panel_y)にしておく。
panel_x,panel_yが後のfacet_matrixで指定した列となる。

通常、facet_matrix(rows = vars(hoge,fuga), cols = vars(piyo))のように、.panel_xrowsで指定した列.panel_ycolsで指定した列が入ったfacetが作られる。

上記サンプルのfacet_matrix(vars(displ, cty, hwy))のように、rows, colsを指定しないと暗黙的にrows = vars(displ, cty, hwy)になるようだ。また、デフォルトではcols = rowsなので上記サンプルではx,y軸ともにdispl, cty, hwy列のfacetとなる。

以下のようなコードの方がわかりやすいかも。

ggplot(mpg) +
  geom_point(aes(x = .panel_x, y = .panel_y)) +
  facet_matrix(rows = vars(cty, hwy), cols = vars(model, drv, fl))

f:id:chito_ng:20190812205036p:plain

facet_matrixを使わない場合

facet_matrixを使わないときはツイート主の言うように、tidyr::gatherを使わないといけなかった。
サンプルコードにあった以下のコードで考える。

# Make asymmetric grid
ggplot(mpg) +
  geom_boxplot(aes(x = .panel_x, y = .panel_y, group = .panel_x)) +
  facet_matrix(rows = vars(cty, hwy), cols = vars(drv, fl))

f:id:chito_ng:20190812205251p:plain

facet_matrixを使わない場合、個々に各組み合わせを作る

# 個々を作る(facet_matrix図の左上)
mpg %>%
  select(drv, cty) %>%
  ggplot(aes(drv, cty)) +
  geom_boxplot()

f:id:chito_ng:20190812205410p:plain

または、tidyr::gatherで作る。ただし、こちらの場合x軸かy軸の片方は1列となる。

# gather使う(facet_matrix図の1行目のみ)
mpg %>%
  select(drv, fl, cty) %>%
  gather(key = type, value = value, -cty) %>% 
  ggplot(aes(value, cty)) +
  geom_boxplot() +
  facet_grid(. ~ type)

f:id:chito_ng:20190812205657p:plain