ggplot2 はグラフを描くためのパッケージである。グラフの仕上がりが総じて R の標準関数に比べて綺麗であるのが特徴的である。また、グラフの書き方について、x 軸および y 軸を指定するだけで簡単に描けるようになっている。

ggplot2 インストールと概要

ggplot2 インストール

ggplot2 パッケージは単体でもインストールでき、tidyverse パッケージのインストールを通してインストールすることもできる。tidyverse パッケージを通してインストールした方が、dplyr、tidyr や tibble などのパッケージも合わせてインストールされるので便利。次の例では、tidyverse をインストールする例を示している。

install.packages('tidyverse')

ggplot2 デフォルトでもきれいなグラフを描くことができるが、ggplot2 の拡張機能の拡張機能を使うことで、さらにきれいなグラフを作成できる。 グラフ全体のスタイル構成(テーマ)を提供しているパッケージとして ggthemes がよく知られている。また、グラフを描くときの点や線の色パターン(カラーパレット)を提供しているパッケージとして RColorBrewer や ggsci などがある。

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

ggplot2 によるグラフ作成

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

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

ggplot2 の基本的な関数の概略は ggplot2 cheatsheet で確認できる。

ggplot2 の呼び出し

ggplot2 パッケージを呼び出して使う。ggplot2 パッケージ単独で呼び出しても、tidyverse パッケージを呼び出しても、どちらでも使えるようになる。ここで、tidyverse パッケージの他に、拡張テーマや拡張カラーパレットも合わせて呼び出しておく。

# library(ggplot2)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(ggthemes)
library(ggsci)

geom_point 関数

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

d <- read.table('data/rice.txt', header = TRUE, sep = '\t')
head(d)
##   replicate block root_dry_mass shoot_dry_mass trt fert variety
## 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 軸として描く例を示す。座標の情報は ggplot 関数の中の aes 関数で指定する。aes 関数の中で x 軸と y 軸にしたい列の列名を指定する。

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

上で書いた散布図では、wt 系統も ANU843 系統の 2 つの系統が含まれている、両方とも黒の点として描かれている。この散布図に対して、系統ごとに点の色を塗り分けたい場合は、aes 関数のcolor オプションで、系統を表す列名(variety)を指定すればいい。

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

この rice データでは、各系統(variety)に対して 3 つの処理(fert)が行われている。具体的に言えば、wt 系統には F10 処理、NH4Cl 処理、NH4NO3 処理がある。また、ANU843 系統にも同様に F10 処理、NH4Cl 処理、NH4NO3 処理がある。系統と処理の両方で点の色を塗り分けたい場合は、color オプションで variety:fert を指定する。

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

系統別に色で分けて、処理別に点の形で分けることもできる。点の形を指定するには aes 関数の shape オプションで指定する。

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

散布図の点について、点の色と形を変えられる他、点の大きさも変更することができる。ここで trees のデータセットを使って、点の大きさをある量に応じて変更してプロットする方法を示す。

data(trees)
head(trees)
##   Girth Height Volume
## 1   8.3     70   10.3
## 2   8.6     65   10.3
## 3   8.8     63   10.2
## 4  10.5     72   16.4
## 5  10.7     81   18.8
## 6  10.8     83   19.7

ここで、周長(Girth)を x 軸とし、高さ(Height)を y 軸として散布図を描く。この際、点の大きさを容積(Volume)となるように描きたい場合は、次のように aes 関数の size オプションを指定する。

g <- ggplot(trees, aes(x = Girth, y = Height, size= Volume)) +
        geom_point()
print(g)