第3章ではggplot2を使ったグラフの作り方について説明してきました。

【3-1】ExcelにはないRでグラフを作るメリットと特徴

【3-2】ggplot2でグラフを作る流れを説明します

【3-3】Rのggplot2で散布図を作るgeom_point関数

【3-4】Rのggplot2でヒストグラムを作るgeom_histogram関数

【3-5】Rのggplot2で密度曲線を作るgeom_density関数

【3-6】Rのggplot2で箱ひげ図を作るgeom_boxplot関数

【3-7】棒グラフの基本とRのggplot2で棒グラフを作るgeom_bar関数

【3-8】ggplot2で折れ線グラフを作るgeom_line関数

【3-9】ggplot2でヒートマップを作るgeom_tile関数



【3-10】Rのggplot2でグループ毎にグラフを作りまとめて表示するfacet_wrap関数では3つのグラフを作成しました。今回はその3つのグラフを並べて1つのグラフにしてしまうgridExtraパッケージを紹介します。


1.使用するデータ

今回は【3-10】Rのggplot2でグループ毎にグラフを作りまとめて表示するfacet_wrap関数で取り込んだデータを使用します。データやコードについては以下をご参照ください。


今回はtidyverseパッケージに加えgridExtraパッケージを使用します。

上記パッケージを一度も使ったことがなければインストールします。
install.packages("tidyverse")
既にインストールしていればlibrary関数で呼び出します。
library(tidyverse) 


macの日本語文字化け対策にヒラギノ角ゴ Pro W3 ("HiraKakuPro-W3"を使っています。
windowの場合はエラーが出るかもしれませんのでtheme_gray(base_family = "HiraKakuPro-W3") +をの色をつけた箇所を消してください。

url <- "https://github.com/mitti1210/myblog/blob/master/fim.csv?raw=true" 
dat <- read.csv(url)

dat_stat <-
  dat %>% 
    gather(key = 項目, value = 点数, 食事:合計, factor_key = TRUE) %>% 
    group_by(項目, sheet) %>% 
    summarize(平均 = mean(点数)) %>% 
    mutate(平均 = round(平均, 1)) 

p_1 <-
dat_stat %>% 
  filter(項目 == "合計") %>% 
  ggplot(aes(x = sheet, y = 平均)) +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_bar(aes(fill = sheet), stat = "identity") +
  geom_text(aes(label = 平均), position = position_stack(vjust = 0.5)) +
  facet_wrap( ~ 項目) +
  labs(x = "", y = "") +
  guides(fill = "none")

p_2 <-
dat_stat %>% 
  filter(項目 %in% c("運動合計", "認知合計")) %>% 
  ggplot(aes(x = sheet, y = 平均)) +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_bar(aes(fill = sheet), stat = "identity") +
  geom_text(aes(label = 平均), position = position_stack(vjust = 0.5)) +
  facet_wrap( ~ 項目) +
  labs(x = "", y = "") +
  guides(fill = "none")

p_3 <-
dat_stat %>% 
  filter(!項目 %in% c("運動合計", "認知合計", "合計")) %>% 
  ggplot(aes(x = sheet, y = 平均)) +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_bar(aes(fill = sheet), stat = "identity") +
  geom_text(aes(label = 平均), position = position_stack(vjust = 0.5)) +
  facet_wrap( ~ 項目) +
  labs(x = "", y = "") +
  guides(fill = "none")
スクリーンショット 2019-08-24 1.07.31
スクリーンショット 2019-08-24 1.07.41
スクリーンショット 2019-08-24 1.07.55


2.gridExtraパッケージについて


gridExtraパッケージのgrid.arrange関数は複数のグラフを並べて1つのグラフにしてくれます。



gridExtraパッケージを一度も使ったことがなければインストールします。
install.packages("gridExtra")
既にインストールしていればlibrary関数で呼び出します。
library(gridExtra) 



3.基本的な使い方

grid.arrange(グラフ1, グラフ2, ...)とつなげるだけです。そうすると縦に並びます。

grid.arrange(p_1, p_2)
スクリーンショット 2019-08-24 1.13.21



4.行数、列数の指定

行数と列数を指定することもできます。

grid.arrange(p_1, p_3, ncol = 1)
ncol = 1は横には1つ並べるという意味になります(何もつけないとこれになる)。
スクリーンショット 2019-08-27 7.17.26



grid.arrange(p_1, p_3, ncol = 2)
ncol = 2は横に2つ並べるとなります。
縦には制限なく並びます。

スクリーンショット 2019-08-27 7.17.34




grid.arrange(p_1, p_2, p_3, ncol = 2, nrow = 2)
ncol = 2は横に2つ並べる、nrow = 2は縦に2つ並べるという意味になります。
スクリーンショット 2019-08-27 7.17.45






5.大きさの比率を変える

縦と横の比率を変えることもできます。

横の比率を指定するwidths =と縦の比率を指定するheights =があります。
また1:2というように2つの数を指定する必要がありますので、width = c(1, 2)のように指定します。
もし横に3つ並べるならwidth = c(1, 3, 2)のように3つ数を指定します。

grid.arrange(p_1, p_2, p_3, ncol = 2, nrow = 2, widths = c(2, 1), heights = c(2,3))

スクリーンショット 2019-08-28 7.51.45





6.自分でレイアウトを作る

さらに細かいレイアウトも可能です。この方法は以下のサイトを参考にさせていただきました。




①自分でレイアウトを作る

3パターンレイアウトを作ってみました。
スクリーンショット 2019-08-28 21.55.43


ポイントはmatrix型にすることです。rbind関数c関数で縦につなぎます。
layout1 <- 
rbind(c(1, 2), c(1, 3)) layout2 <-
rbind(c(1, 3), c(2, 3)) layout3 <-
rbind(c(1, 2), c(3, 3))



②関数で作ったレイアウトを指定する

作ったレイアウトを指定するにはlayout_matrix = を指定します。
加えてwidths =heights =で微調整しています。


レイアウト1
grid.arrange(p_1, p_2, p_3, layout_matrix = layout1, widths = c(1, 3), heights = c(1, 2.5))
スクリーンショット 2019-08-28 22.00.35


レイアウト2
grid.arrange(p_1, p_2, p_3, layout_matrix = layout2, widths = c(1, 2))
スクリーンショット 2019-08-28 22.00.49



レイアウト3
grid.arrange(p_1, p_2, p_3, layout_matrix = layout3, heights = c(1, 2))
スクリーンショット 2019-08-28 22.01.01


7.まとめ

今回はパッケージを使って複数のグラフを1つにまとめる方法を紹介しました。

工夫次第でいろいろな見せ方ができます。gridExtraは便利なパッケージですのでぜひ試してみてください。