2019-05-09 改訂: Windows で図を保存する場合も、サイズをインチで指定するように変更 (units 引数が指定できなくなっていたので)。

今回の目標

ggplot2の基礎

ggplot2 とは何か

ggplot2 は、Rで綺麗な図を作るためのパッケージである。 RStudio のChief Scientist である Hadley Wickham が大学院生時代に開発・公開し、アップデートを重ねてきたものである(Hadley は tidyverse などの重要パッケージ開発の中心人物であり、世界中のRユーザから最も尊敬されている人物だと考えられる。日本の一部のRユーザは彼を「羽鳥先生」と呼ぶ)。

ggplot2 の gg は grammar of graphics(図のための文法) という意味で、一貫した方法で様々な図が作れるように工夫されている。 最初は文法を覚えるのに少し苦労するかもしれない。しかし、一度文法を身につけてしまえば、様々な図を簡単に作れるようになるので、とても便利である。また、デフォルト(既定)の設定でそれなりに綺麗な図が作れるのも魅力である(某表計算ソフトのように、何も考えずに 3D棒グラフのような醜い図を作ってしまうということが防げる)。

ggplot2 についての詳しい説明は、Hadley自身が書いた ggplot2: Elegant Graphics for Data Analysis, 2nd ed. (Springer) で読める(PDFファイル が無料で公開されている)。

また、チートシート(日本語版; 英語版)が公開されているので、ダウンロードしていつでも見られるようにしておくと、便利である。

ggplot2 パッケージの読み込み

今回利用するパッケージを読み込む。ggplot2tidyverse に含まれているので、library()tidyverse を読み込めばよい。パッケージをインストール済みでない場合は、読み込みの前にまずinstall.packages() でインストールする。

Macユーザのみ次のコードも実行する(Windowsユーザは実行しない)。

ggplotの基本的な使い方

データフレーム

ggplot2 で図を作るためには、データフレーム (data frame) と呼ばれる形式のデータが必要である。 readr::read_csv()read.csv() などでデータを読み込めば、データフレームができる。

例として、これまでの授業でも使った fake-data-01.csv を読み込んでみよう。プロジェクト内の data ディレクトリ(フォルダ)に fake-data-01.csv があることを想定している。

## Parsed with column specification:
## cols(
##   id = col_double(),
##   gender = col_character(),
##   age = col_double(),
##   height = col_double(),
##   weight = col_double(),
##   income = col_double()
## )

これがデータフレームかどうか確かめるために、is.data.frame() を使う。

## [1] TRUE

TRUE (真)という答えが返され、myd がデータフレームであることがわかる。

また、データフレームは、data.frame() で作ることもできる。データフレームの代わりにtibble と呼ばれる形式のデータを使うこともできる。tibble は、tibble::tibble() で作れる。

練習のために、df1という名前のデータフレームと、df2という名前のtibble を作ってみよう。まず、x とy という二つの変数をもつdf1 を作る。

## [1] TRUE

次に、v1, v2, v3 という3つの変数をもつ df2 を作る。rnorm(n, mean, sd) で、平均がmean、標準偏差がsd の正規分布から n個の乱数を生成することができる(詳しくは、今後の授業で説明する)。

## [1] TRUE

df1とdf2の両者が “data.frame” (データフレーム)であることが確認できた。特にdata.frame() の方を好む理由がなければ、今後は tibble() でデータフレーム (tibble) を作ろう。

それぞれの中身を確認してみよう。

## Observations: 10
## Variables: 2
## $ x <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
## $ y <int> 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
## Observations: 100
## Variables: 3
## $ v1 <dbl> -0.3464615, 11.4498748, 1.7233224, -0.3811057, -5.2453548, -5…
## $ v2 <dbl> 2.4065593, -4.7917496, -8.8178080, -9.9918170, -0.7096655, -6…
## $ v3 <dbl> 0.08949345, -0.19456871, 1.07364719, -0.15110109, 0.08577871,…

MS Excel等で見慣れたスプレッドシート形式でデータの中身を確認したいときは、View() を使う(この関数は R Markdown ファイルではなく、Console に直接入力する方がいい)。 例えば、

とすると、スプレッドシートが表示される。データの中身を確認できたら、スプレッドシートは閉じよう。

ggplot()

ggplot2パッケージを使った作図でまず使うのが、ggplot2::ggplot() という関数である。 この関数は、データフレームを第1引数にとる。

例えば、

のように使う。ただし、データフレームを指定しただけでは、図はできない。

geom_xxx()

図を作るためには、geom_xxx() のように、geom から始まる関数で新たな層 (layer) を加える必要がある。geom とは geometry(形状)のことである。例えば、ヒストグラム (histogram) を作るときはgeom_histogram() を、箱ひげ図 (box[-and-whisker] plot) を作るときは geom_boxplot() を使う。

例として、df2 の変数のヒストグラムを作ってみよう。 まず、df2をggplot() に渡し、その結果を h1 としてよう。

次に、ヒストグラムの層を加える。df2にはv1, v2, v3 という3つの変数があるので、どの変数を図にするかを指定する必要がある。作図に用いる変数の指定は、aes() で行う。aes とは aesthetics(美感)のことである。この aes() の指定の仕方は、作る図によって異なる。したがって、ggplot2 の使い方をマスターするには、geom ごとに異なるaes の使い方を覚える必要がある。覚えるといっても、必ずしも暗記する必要なない。頻繁に使うものは覚えた方が楽(自然に覚える)が、その他のものについては、チートシート(日本語版; 英語版)やインターネット上にまとめられた情報(例えば、ココココ)で確認すればよい。

例として、ヒストグラムを作ってみよう。縦軸が度数 (count, frequency) のヒストグラムを作るには、aes()x を指定する。次のようにして、先ほど作った h1 にv1 のヒストグラムの層を加え、h2と名前をつけよう。

これでヒストグラムができているはずだ。作ったヒストグラムを表示するには、plot() または print() を使う。

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

このように、ggplot2を使った基本的な作図は、3つのステップでできる。

  1. ggplot() にデータフレームを渡す。
  2. 作りたい図の geom_xxx() 層を加える。
  3. plot() または print() で作った図を表示する。

ステップ1とステップ2は同時に実行できる。そのためには、次のようにする。

コードを読みやすくするために、このコードのように+ の直後で改行することを強く勧める。RStduioは、2行目以降も一つの命令が続いていることが一目でわかるよう、2行目以降を字下げ (indent) して表示してくれる。

確認のため、h3を表示する。

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

先ほどと同じ図ができた。

また、aes() の指定は、ggplot() の中で行うこともできる。例えば、次の方法で上と同じ図ができる。

確認してみよう。

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

再び同じ図ができた。

labs()

ここまでで図の中身はできた。しかし、論文やレポートなどで図を使うときには、軸ラベルまで思い通りにコントロールする必要がある。日本語で文章を書いているなら、図のラベルも日本語にする方が親切だろう。

(注: RStudio Cloud では、図の中で日本語が使えないようである。)

ラベルの変更は、labs() で行う。仮に、v1 という変数が「クラス1の得点」を表しているとして、h4の軸ラベルを変更してみよう。

表示してみよう。

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

軸ラベルも、作図と同時に加えることができる。軸ラベルだけでなく、グラフのタイトルもつけてみよう。

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

これまでの例からわかる通り、ggplot2 を用いた作図で新しい層を付け加えるときは、1つずつ加えてもよいし、全部同時に加えてもよい。

作成した図の保存

作成した図は、PDFファイルやPNGファイルなどの外部ファイルに保存することができる。プロジェクト内に、図を保存するための figs とういディレクトリ(フォルダ)を新たに作り、図をその中に保存しよう。

基本的には、以下の3つのステップで図を保存する。

  1. 図を保存するためのファイルを開く(作る)
  2. 図をファイルに書き込む
  3. ファイルを閉じる

これら3つのステップはセットで行う。R Markdown を使っている場合は特に注意が必要で、各ステップを一つずつ実行しても図が保存されない。 そこで、3つのスッテプを一つのコードチャンクの中にまとめて書き、チャンク右上の実行ボタン (Run Current Chunk) をクリックして全てのステップを一挙に実行する必要がある。

図のファイルを作るときは、あらかじめ図のサイズ(高さと幅)を決めておくことが重要である。いい加減なサイズで図を作り、後で拡大・縮小すると、軸ラベルの文字などが伸びたり縮んだりして汚くなるので、スマートではない

Windows とMacでは使う関数がやや異なるので、別々に説明する(Linux については省略 [Linux を使える人は自分で調べられるでしょう])。

Windows で図を保存する

2019-05-09 追記: 環境によっては、PNGファイルでの保存ができないようだ。

先ほど作ったヒストグラム h6 を、PDFファイルに保存しよう。図を保存するためのPDFファイルは、pdf() で作る。 ファイル名は、hist-h6.pdf にしよう。図の大きさは、A4用紙の半ページよりやや小さくなるように、高さ (height) を4インチ (101.6mm)、幅 (width) を5インチ (127.0mm)にしよう。また、軸ラベルに日本語を使っているので、日本語を表示できるフォントを指定する必要がある。ここでは、Japan1GothicBBB を指定する。第1ステップの内容をまとめると、次のようになる(第1ステップだけで実行しない!!!)。

filefigs/ という部分が、figs ディレクトリ(フォルダ)の中にファイルを作ることを指示している。

第2ステップは、第1ステップの直後にprint(h6) とすればよい。

最後に、ファイルを閉じるために、dev.off() を実行する。

以上をまとめると、次のようになる。R Markdown では、以下のコードチャンクを一挙に実行する必要がある(Rスクリプトでは、1行ずつ実行してよい)。

これで図が保存されるはずだ。figsディレクトリの中に、hist-h6.pdf というPDFファイルができていることを確かめよう。また、PDFファイルを開き、図が保存されていることも確認しよう。

同様に、PNGファイルに図を保存してみよう。PNGファイルは、png()で作れる。 関数の中で指定する内容は、pdf()で使ったもののうち、ファイル名の最後(拡張子)を “.png” に変えるだけでよい。

これで図が保存されるはずだ。figsディレクトリの中に、hist-h6.png というPNGファイルができていることを確かめよう。また、PNGファイルを開き、図が保存されていることも確認しよう。

Mac で図を保存する

Mac で図を保存するには、quartz() という関数を使うのが便利でる。 先ほど作ったヒストグラム h6 を、PDFファイルに保存しよう。 ファイル名は、hist-h6.pdf にしよう。PDFファイルで保存するために、type = "pdf" を指定する。 図の大きさは、A4用紙の半ページよりやや小さくなるように、高さ (height) を4インチ (101.6mm)、幅 (width) を5インチ (127.0mm)にしよう。また、軸ラベルに日本語を使っているので、日本語を表示できるフォントを指定する必要がある。ここでは family = "sans" (サンセリフ体)を指定しよう。上でlibrary("tidyverse") を実行した直後に、theme_set() で HiraginoSans-W3 を指定したので、ヒラギノ角ゴシックが使われる。 第1ステップの内容をまとめると、次のようになる(第1ステップだけで実行しない!!!)。

filefigs/ という部分が、figs ディレクトリ(フォルダ)の中にファイルを作ることを指示している。

第2ステップは、第1ステップの直後にprint(h6) とすればよい。

最後に、ファイルを閉じるために、dev.off() を実行する。

以上をまとめると、次のようになる。R Markdown では、以下のコードチャンクを一挙に実行する必要がある(Rスクリプトでは、1行ずつ実行してよい)。

これで図が保存されるはずだ。figsディレクトリの中に、hist-h6.pdf というPDFファイルができていることを確かめよう。また、PDFファイルを開き、図が保存されていることも確認しよう。

同様に、PNGファイルに図を保存してみよう。PNGファイルを作るためには、type = "png" を指定し、 ファイル名の最後(拡張子)を “.png” に変えるだけでよい。

これで図が保存されるはずだ。figsディレクトリの中に、hist-h6.png というPNGファイルができていることを確かめよう。また、PNGファイルを開き、図が保存されていることも確認しよう。

よく使う図の作り方

ggplotの使い方を身につけるために、統計学でよく使う基本的な図を作ってみよう。

例として、fake-score.csv という架空のデータを使おう。このデータに含まれる変数は、以下の通りである。

まず、データを保存するためのディレクトリを作る。既にプロジェクト内に data ディレクトリがある場合、このコマンドは実行しなくてよい。

次に、データをダウンロードする。

データを読み込む。

## Parsed with column specification:
## cols(
##   id = col_double(),
##   class = col_double(),
##   gender = col_character(),
##   math = col_double(),
##   english = col_double(),
##   chemistry = col_double()
## )

データの中身を確認する。

## Observations: 400
## Variables: 6
## $ id        <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
## $ class     <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ gender    <chr> "female", "female", "female", "female", "female", "fem…
## $ math      <dbl> 100, 43, 80, 52, 63, 45, 74, 54, 59, 74, 65, 41, 71, 7…
## $ english   <dbl> 68, 59, 67, 60, 72, 59, 69, 66, 72, 73, 77, 52, 69, 65…
## $ chemistry <dbl> 97, 60, 75, 60, 57, 67, 62, 63, 69, 67, 70, 48, 59, 76…

正しくデータが読み込めたようだ。このデータを使い、作図の方法を学習しよう。

棒グラフ

棒グラフ (bar_plot) は geom_bar() で作る。まず、クラスごとの人数を棒グラフにしてみよう。 横軸にクラス、縦軸にはクラスの人数を表示する。そのために、次のコマンドを使う。

表示してみよう。

各クラスの人数が、等しく50人ずつであることがわかる。

横軸のクラスの数字1から8のうち、表示されていない数字がある。scale_x_continuous() を使って、すべて表示させよう。既に作った bar1 を基に、新しい図を作る。

表示してみよう。

クラスの数字をすべて表示することができた。

男女の内訳はどうなっているだろうか。男女を色分けして描き、図で確かめよう。 データセットに含まれる gender という変数を使って色分けするために、aes の中で fill を指定する。