ggplot2で多重クロス表を作る
- 最近は大学院の研究でひたすら3重クロス表の分析を行っています。
- Rでは
xtable
パッケージのxtable()
を使うと2重クロス表をTeX形式で出力してくれるのですが、3重以上の多重クロス表には対応していません。gridExtra::grid.table()
を使う方法もあるかと思いますが、余白の扱いや多重の場合が少し面倒な印象があります。
- そこで今回は、ggplot2を使った多重クロス表の出力方法を紹介します
セッション情報
- 毎度のことながらrstudio cloud上で動かしています。
> sessionInfo() R version 3.5.3 (2019-03-11) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 16.04.6 LTS Matrix products: default BLAS: /usr/lib/atlas-base/atlas/libblas.so.3.0 LAPACK: /usr/lib/atlas-base/atlas/liblapack.so.3.0 locale: [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base
下準備
{MASS} パッケージ内の Cars93
データを用います。
library(tidyverse) data <- MASS::Cars93
まずは普通に出力
- 車種(Type)、駆動系(DriveTrain)、生産国(Origin)の3重クロス表を作成します。
crosstab <- data %>% select(Type,DriveTrain,Origin) %>% table
> crosstab , , Origin = USA DriveTrain Type 4WD Front Rear Compact 0 7 0 Large 0 7 4 Midsize 0 9 1 Small 0 7 0 Sporty 2 2 4 Van 3 2 0 , , Origin = non-USA DriveTrain Type 4WD Front Rear Compact 1 6 2 Large 0 0 0 Midsize 0 8 4 Small 2 12 0 Sporty 0 5 1 Van 2 2 0
geom_tileを使ってplotする
- 何はともあれtidyに。
tidy_crosstab <- as.data.frame.table(crosstab)
> tidy_crosstab Type DriveTrain Origin Freq 1 Compact 4WD USA 0 2 Large 4WD USA 0 3 Midsize 4WD USA 0 4 Small 4WD USA 0 5 Sporty 4WD USA 2 6 Van 4WD USA 3 7 Compact Front USA 7 8 Large Front USA 7 9 Midsize Front USA 9 10 Small Front USA 7 11 Sporty Front USA 2 12 Van Front USA 2 13 Compact Rear USA 0 14 Large Rear USA 4 15 Midsize Rear USA 1 16 Small Rear USA 0 17 Sporty Rear USA 4 18 Van Rear USA 0 19 Compact 4WD non-USA 1 20 Large 4WD non-USA 0 21 Midsize 4WD non-USA 0 22 Small 4WD non-USA 2 23 Sporty 4WD non-USA 0 24 Van 4WD non-USA 2 25 Compact Front non-USA 6 26 Large Front non-USA 0 27 Midsize Front non-USA 8 28 Small Front non-USA 12 29 Sporty Front non-USA 5 30 Van Front non-USA 2 31 Compact Rear non-USA 2 32 Large Rear non-USA 0 33 Midsize Rear non-USA 4 34 Small Rear non-USA 0 35 Sporty Rear non-USA 1 36 Van Rear non-USA 0
- ggplotにつっこむ。
g <- ggplot(data = tidy_crosstab, aes(x = Type, y = DriveTrain, label = Freq)) g <- g + geom_tile(fill = "white",col = "black") g <- g + geom_text() g <- g + facet_wrap(~Origin, nrow = 1)
- 出力されるのはこんな感じの画像になります。
4重クロス表
- AirBagという変数を増やした4重クロス表を出力します
- 今度は、
facet_grid()
を使います。
crosstab2 <- data %>% select(Type,DriveTrain,AirBags,Origin) %>% table tidy_crosstab2 <- as.data.frame.table(crosstab2) g <- ggplot(data = tidy_crosstab2, aes(x = Type, y = DriveTrain, label = Freq)) g <- g + geom_tile(fill = "white",col = "black") g <- g + geom_text() g <- g + facet_grid(Origin ~ AirBags)