このパッケージがすごい2014: ggplot2
library(ggplot2)
library(dplyr)

この記事はR Advent Calender 2014@Qiita1日目の記事「このパッケージがすごい2014」の一部です

ggplot2: An implementation of the Grammar of Graphics

ggplot2パッケージはRのグラフィックスに特化したパッケージです。開発者は「神」ことHadley Wickhamさんです。

Rユーザーの中では、グラフィックスにlatticeパッケージを利用するかggplot2を利用するかという論争があったりなかったり。どちらも一長一短、覚えるのに少し手間がかかりますが、今年一年(実際にはここ数ヶ月)ggplot2と向き合った結果、ggplot2 > latticeという形になりました(宗教上の理由でもある)。

今年5月にはバージョン0.9から1.0になりました。バンザイ

ggplot2の概念

ggplot2は「The Grammar of Graphics」という本の概念に基づきます。グラフィックスの文法と呼ばれる表記方法を用いることにより、より読みやすい・見栄えの良いグラフを作成します。

ggplot2パッケージ内のグラフィックス描画関数はqplot関数ggplot関数があります。qplotQuick plotという説明文とおり、データをすばやく描画するのに向いています。なおかつ、Rの標準描画関数plotに近い処理ができるので直感的に理解しやすいです。対してggplotはggplot2のメイン関数であり、他の関数と組み合わせることで複雑で協力なな描画が可能になります。

ggplot2ではこの2つの描画関数がプロットオブジェクトとして扱われるため、再帰的に呼び出すことが可能です。また、一度作成したプロットオブジェクトにグラフィックスパラメータを付け加えていくことが基本となります。

以下にirisデータを使った例を示します。

data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

qplot

iris.plot <- qplot(x= Sepal.Width, y = Sepal.Length,
      data = iris,
      color = Species)
iris.plot

ggplot2ではプロットする際に使用するデータをdata引数により明示的に示します(どのように示すかではなく、何を示したいか、という考えがggplot2では大事)。

上の例ではiris.plotというプロットオブジェクトに代入しましたが、一度作成したプロットオブジェクトをもとに拡張してみましょう。種ごとに別々に示す例です(ファセット)。

iris.plot + facet_wrap(~ Species)

上の図では、color引数でirisデータのSpeciesごとに色を変更するようにしました。では次にプロットの大きさと形を変更します。

qplot(x = Sepal.Width, y = Sepal.Length,
      color = Species,
      size = 2,
      shape = Species,
      data = iris)

プロットの大きさを変更する引数はsize、形の変更はshape引数で行います。色と形の変更は、カテゴリー変数であれば自動的に行ってくれます。

ここまでは散布図の例でしたが、散布図以外のプロットを行いたい場合にはgeom引数で表示形式を変更できます。箱ひげ図で種ごとの萼片長さを出力します。

qplot(x = Species, y = Sepal.Length,
      data = iris,
      geom = "boxplot")

ggplot

qplot以上に複雑で柔軟性のある描画を可能にするのがggplot関数です。ggplot関数はグラフ描画の過程をいくつかの部品として分割し、レイヤー(部品)を重ねることで目的のプロットを行います。

ggplot(
  mapping = aes(
    x = Sepal.Width, y = Sepal.Length, color = Species),
  data = iris)

ggplot関数では、qplot関数のようにデータとグラフに示す変数を指定しただけではプロットできません。まずはgeom_ではじまるレイヤー関数を指定し、プロットの形を決定します。ここでは上の例と同じく、散布図を作成します。

ggplot(
  mapping = aes(
    x = Sepal.Width, y = Sepal.Length, color = Species),
  data = iris) +
  geom_point()

geom_pointのほかに、geom_bargeom_boxplotなどがあります。

幾何関数の追加

つぎはプロットにy = ax + bの回帰直線を加えてみます。ggplot関数もプロットオブジェクトとして扱われるので、一度iris.plotというオブジェクトとして保存します。

filter(iris, Species == "setosa")  %>% 
  ggplot(
    mapping = aes(
      x = Sepal.Width, y = Sepal.Length),
    data = .) -> iris.plot
iris.plot + geom_point() + geom_smooth(method = lm, se = F)

背景の変更: theme

ggplot2ではtheme関数によりプロットの際のテーマがいくつか用意されています。初期設定では灰色の地なので少し変更してみます。

ggplot(data = iris,
      aes(x= Sepal.Width, y = Sepal.Length, color = Species)) +
  geom_point() + 
  theme_classic() +
  theme_bw(base_size = 12)

ggthemrパッケージはggplot2のテーマを拡張するためのパッケージです

参考