7 tidyverse

7.5 ggplot2

ggplot2 はデータの可視化を行うパッケージであり、 ggplot2 のグラフの仕上がりは、R の標準関数に比べてきれい。 基本的にデータフレーム(または tibble)に保存されたデータに対して、 x 軸と y 軸となる列名を指定するだけで、簡単できれいなグラフが描けるため、様々な場面で使わる。

ggplot2 の拡張機能

ggplot2 デフォルトでもきれいなグラフを描くことができるが、 ggplot2 向けに作られた拡張機能を使うことで、さらにきれいなグラフを作成できる。 グラフ全体のスタイル構成(テーマ)を提供しているパッケージとして ggthemes が知られている。 グラフを描くときの点や線の色パターン(カラーパレット)を提供しているパッケージとして、 RColorBrewer や ggsci などが知られている。 また、ggpubr および gridExtra パッケージは複数の ggplot グラフを 1 つの画面で表示させるためのパッケージである。 これらのパッケージを予めインストールしておくとよい。

install.packages('ggthemes')
install.packages('RColorBrewer')
install.packages('ggsci')
install.packages('ggpubr')
install.packages('gridExtra)

ggplot2 を利用したグラフ作成の手順

ggplot2 でグラフを描くとき、基本的に次のような手順を踏む。

  1. ggplot2 で描きたいグラフを、手書きで紙に書いてみる。簡単なグラフは必ずしも手書きする必要はないが、複雑なグラフを描くときは必ず手書きで一度紙に書いておくとよい。
  2. 手書きのグラフを確認し、その x 軸と y 軸となるデータを、データフレームとして作成する。必要であれば、色の使い分けに関する情報もそのデータフレームに入れる。
  3. ggplot2 の関数でグラフを描く。
    • ggplot 関数で描画レイヤーを用意する。この際に、aes オプションで x 軸、y 軸、色情報などを指定する。
    • geom_pointgeom_line などの関数を使用してグラフを描く。
    • xlabylabxlimylimtheme などの関数でグラフの軸座標やカラースタイルを調整する。

ggplot2 の基本的な関数の概略は RStudio ウェブサイトで公開されている ggplot2 cheatsheet で確認できる。

ggplot2 準備

(ggplot2 パッケージを含む)tidyverse パッケージおよび グラフのテーマやカラーパレットなどを指定するためのパッケージも合わせて呼び出して準備する。

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ purrr   0.3.4
## ✓ tibble  3.0.3     ✓ dplyr   1.0.1
## ✓ tidyr   1.1.1     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggthemes)
library(ggsci)
library(ggpubr)
library(ggExtra)

geom_point 関数

geom_point 関数は散布図を描く関数である。 ここでは、rice.txt データセットを使ってグラフを描く例を示す。 rice データセットには 7 つの列があり、 それぞれの列が標本の個体番号(replicate)、ブロック番号(block)、 根部乾燥重量(root_dry_mass)、地上部乾燥重量(shoot_dry_mass)、 系統処理(trt)、処理(fert)、系統(variety)からなる。

d <- read_tsv('data/rice.txt')
## Parsed with column specification:
## cols(
##   replicate = col_double(),
##   block = col_double(),
##   root_dry_mass = col_double(),
##   shoot_dry_mass = col_double(),
##   trt = col_character(),
##   fert = col_character(),
##   variety = col_character()
## )
head(d)
## # A tibble: 6 x 7
##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
## 1         1     1            56            132 F10   F10   wt     
## 2         2     1            66            120 F10   F10   wt     
## 3         3     1            40            108 F10   F10   wt     
## 4         4     1            43            134 F10   F10   wt     
## 5         5     1            55            119 F10   F10   wt     
## 6         6     1            66            125 F10   F10   wt

簡単な散布図として、各個体の根部乾燥重量(root_dry_mass)を x 軸とし、 地上部乾燥重量(shoot_dry_mass)を y 軸としてグラフを描く例を示す。 x 座標および y 座標の情報は ggplot 関数の中の aes 関数の中で指定する。 指定方法として、データフレーム d の中で x 座標にしたい列の列名(root_dry_mass)を x オプションに、 y 座標にしたい列名(shoot_dry_mass)を y オプションに指定する。

p <- ggplot(d, aes(x = root_dry_mass, y = shoot_dry_mass)) +
      geom_point()
print(p)

上で描いた散布図に wt 系統と ANU843 系統の 2 つの系統のデータが含まれている。 両方とも黒の点として描かれ、区別できない。 そこで、この散布図に対して、系統ごとに点の色を塗り分けて wt 系統と ANU843 系統を区別できるようにする。 色を指定するときは、aes 関数の color オプションを使う。 系統ごと(variety 列にある値に基づいて)色を塗り分けたいので、 ここでは color オプションに系統を表す列名 variety を指定する。

p <- ggplot(d, aes(x = root_dry_mass, y = shoot_dry_mass, color = variety)) +
      geom_point()
print(p)

rice データは、各系統(variety)に対して 3 つの処理(fert)が行われている。 具体的に言えば、wt 系統には F10 処理、NH4Cl 処理、NH4NO3 処理がある。 また、ANU843 系統にも同様に F10 処理、NH4Cl 処理、NH4NO3 処理がある。 系統と処理の違いがわかるように点の色を塗り分けたい場合は、 variety 列と fert 列の組み合わせ(interaction)に対して色を付ければよい。 そのためには、aes 関数の color オプションに interaction(variety, fert) を代入する。 なお、variety 列のラベルと fert 列のラベルの組み合わせを作るとき、 両方のラベルを結合するときの区切り文字として ’ / ’ を使うことにする。

p <- ggplot(d, aes(x = root_dry_mass, y = shoot_dry_mass,
                   color = interaction(variety, fert, sep = ' / '))) +
      geom_point()
print(p)

各系統を点の色で区別し、各処理を点の形で区別することもできる。 点の形を指定するオプションとして shape があるので、 このオプションに各処理のラベルが含まれている列名(fert)を指定する。

p <- ggplot(d, aes(x = root_dry_mass, y = shoot_dry_mass, color = variety, shape = fert)) +
      geom_point()
print(p)