作図 作図発展

【R】1枚の図に複数種類のグラフをプロットする方法

2021年12月19日

この記事ではRのggplotで作った複数の図を1枚の図にまとめる方法を紹介します。

概要

  • 複数のグラフを1枚にまとめるときは patchworkパッケージが便利

イメージ

複数のグラフを1枚にプロットするイメージは以下の通りです。patchworkパッケージを呼び出しておけば、ggplotで作成したグラフを足し算で繋いでいくだけでグラフを組み合わせていくことができます。

基本的には 作成したグラフを変数に格納して足し合わせるだけ

レイアウト

patchworkを使ったレイアウト方法について紹介します。レイアウトを設定する方法は2つあり、1つは plot_layout()関数を使う方法で、もう1つはレイアウトのショートカットとして 「|」や「/」を使う方法です。ここからそれぞれの方法について紹介していきます。

plot_lauyout()でレイアウトを設定

まず王道のレイアウト設定方法は plot_layout()関数を使う方法です。この関数はこの後紹介するショートカット「|」や「/」を使う場合はうまく動作しないことがあります。なのでプロットを「+」で繋いだ後に plot_layout()を呼び出してください。設定できる項目は以下の通りです。

設定項目

  • ncol :何列になるように並べるか指定
  • nrow :何行になるように並べるか指定
  • byrow :行方向に順番に並べるかどうか指定
  • widths :横幅の比(列の数に合わせて数字で指定)
  • heights :縦幅の比(行数に合わせて数字で指定)
  • guides :凡例をまとめるかを設定
  • tag_level :タグ名を新しく設定するか指定
  • design :並べ方のレイアウトをマトリックスで指定

「|」や「/」でレイアウトを設定

「+」で並べ方を指定せずに図を繋げるのではなく、並べ方を指定しながら図を繋げていくことも出来ます。図の追加/結合に使える演算子は以下の通りです。

使える記号

  • + :レイアウトを指定せずに単純に連結
  • | :右隣に連結
  • / :下に連結
  • () :1まとめにレイアウトを指定

記号をうまく使えばplot_layout()を使わず簡潔にレイアウト可能

具体例

ここからは具体的な使い方を紹介していきます。

2枚のグラフを1つにまとめる

まずは基本的な使い方として2つのグラフを1枚にまとめる方法を紹介します。

# 必要なパッケージを準備
library(tidyverse)
library(patchwork)

# 1つ目(左側)のプロットを作成
p1 = midwest %>% 
  ggplot(aes(x = state, y = area, fill = state)) +
  geom_boxplot()

# 2つ目(右側)のプロットを作成
p2 = midwest %>% 
  ggplot(aes(x = perchsd, y = percelderlypoverty, color = state, group = state)) +
  geom_smooth(method = "gam", se = FALSE, fullrange = FALSE, alpha = .3) +
  geom_point(alpha = .6) 

# 2つのプロットを組み合わせる
p1 + p2

単純に組み合わせる時は 「+」で足し合わせるだけで良い

凡例を1つにまとめる

せっかく複数グラフを1枚にまとめるなら、各グラフの凡例を1か所にまとめたいところです。patchwork の plot_layout()関数で guides = "collect" を指定することでで1か所にまとめるかどうかを指定することができます。

# パッケージ
library(tidyverse)
library(patchwork)

# 1つめのヒストグラム
histogram1 = midwest %>% 
  ggplot(aes(x = perchsd, fill = state)) + 
  geom_histogram(color = "black")

# 2つめのヒストグラム
histogram2 = midwest %>% 
  ggplot(aes(x = percelderlypoverty, fill = state)) + 
  geom_histogram(color = "black") 

# 組み合わせる
histogram1 + histogram2 + 
  plot_layout(guides = "collect", ncol = 1) # 凡例を1つにまとめて1列で表示

凡例をまとめるときは plot_layout(guides = "collect")を指定する

散布図にヒストグラムを重ねる

複数グラフを1枚にまとめる際よくあるのが散布図とヒストグラムを組み合わせるケースです。散布図で2変数の関連を視覚化し、ヒストグラムで各変数の分布も確認できます。

この場合は綺麗に並べるために右上に空白のスペースを入れ、右下のヒストグラムを90°回転させる必要があります。空白のスペースを入れる時は、plot_spacer()を使います。またグラフを回転させるときは coord_flip() を使います。また今回のケースでは縦横2×2のグラフ配置にしますが、散布図が位置する左側の2つの図の横幅を増やし、下側の2つの縦幅を増やして見た目を整えると良い感じに仕上がります。

# 必要なパッケージを準備
library(tidyverse)
library(patchwork)

# 散布図作成
scatter = midwest %>% 
  ggplot(aes(x = perchsd, y = percelderlypoverty, color = state, group = state)) +
  geom_smooth(method = "gam", se = FALSE, fullrange = FALSE, alpha = .3) +
  geom_point(alpha = .6) 

# perchsdのヒストグラム作成
histogram1 = midwest %>% 
  ggplot(aes(x = perchsd, fill = state)) + 
  geom_histogram(color = "black")

# percelderlypovertyのヒストグラム作成
histogram2 = midwest %>% 
  ggplot(aes(x = percelderlypoverty, fill = state)) + 
  geom_histogram(color = "black") + 
  theme(axis.title.y = element_blank()) + 
  coord_flip() # 図を90°回転させる

# グラフを組み合わせてレイアウトを整える
histogram1 + plot_spacer() + scatter + histogram2 + 
  plot_layout(guides = "collect", widths = c(3, 1), heights = c(1, 3)) # 縦横比を設定し凡例をまとめる

右上にスペースを入れ、右下のヒストグラムを90°回転させるのがポイント

グラフの中にグラフを描く

グラフどうしを隣接させるだけでなく、グラフの中に他のグラフを表示させることもできます。

グラフの中にグラフを描くときは patchworkパッケージの inset_element()関数を使います。inset_element()関数の中で、表示したいグラフを指定し、表示する位置を top、right、bottom、leftで指定します。

位置の設定は1に設定すると幅いっぱいに表示します。そのため右端にあわせて表示するときはright を1に設定します。

# パッケージ
library(tidyverse)
library(patchwork)

# 散布図
scatter = midwest %>% 
  ggplot(aes(x = perchsd, y = percelderlypoverty, color = state, group = state)) +
  geom_smooth(method = "gam", se = FALSE, fullrange = FALSE, alpha = .3) +
  geom_point(alpha = .6) + 
  guides(color = FALSE) # 凡例を表示しない

# ヒストグラム
histogram = midwest %>% 
  ggplot(aes(x = perchsd, fill = state)) + 
  geom_histogram(color = "black") + 
  guides(fill = FALSE) # 凡例を表示しない
  
# 散布図の中にヒストグラムを表示
scatter + 
  inset_element(histogram, left = 0.6, bottom = 0.6, right = 1, top = 1)

グラフの中にグラフを描くときは inset_element()関数を使う

-作図, 作図発展