ggforce::facet_matrixを用いてfacet_grid(c(A,B,C) ~ c(D,E))的な表現を実現する
以下のツイートを見かけたので試してみた記事。
ggforce::facet_matrix 凄いわ.tidyr::gather をスキップできる…….
— atusy (@Atsushi776) August 9, 2019
ggplot(iris) +
geom_boxplot(aes(Species, .panel_y)) +
ggforce::facet_matrix(
rows = vars(everything(), -Species), cols = vars(Species)
) pic.twitter.com/bo6dprgBzb
ドキュメント的にはこれ。
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))
facet_matrixを使うときは、aes
はaes(x = .panel_x, y = .panel_y)
にしておく。
panel_x
,panel_y
が後のfacet_matrix
で指定した列となる。
通常、facet_matrix(rows = vars(hoge,fuga), cols = vars(piyo))
のように、.panel_x
にrowsで指定した列
、.panel_y
にcols
で指定した列が入った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))
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))
facet_matrixを使わない場合、個々に各組み合わせを作る
# 個々を作る(facet_matrix図の左上) mpg %>% select(drv, cty) %>% ggplot(aes(drv, cty)) + geom_boxplot()
または、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)