Rのグラフィック作成パッケージ“ggplot2”について

概要
非常に美しいグラフが非常に効率的に作れるRのパッケージ“ggplot2”の紹介。

はじめに

Rには、“ggplot2”というライブラリがある。このライブラリを使うと、デフォルトの作図コマンドよりも効率的に作図ができ、しかも分かりやすくて美しい図を描くことができる。美しい図といってもピンと来ないかもしれないが、百聞は一見にしかず、下の2つの図を比べてもらいたい。1つ目の白い背景の図がRのデフォルトの作図コマンドで作成された散布図である。2つ目の灰色の背景の図が“ggplot2”を使った散布図である。

Rのデフォルトの作図機能を使った場合の散布図の例
Rのデフォルトの作図機能を使った場合の散布図の例
“ggplot2”を使った場合の散布図の例
“ggplot2”を使った場合の散布図の例

以下では、“ggplot2”のコンセプトと簡単な作例を紹介したいと思う。最初は抽象的な話をする。このため、最初から読んで分かりづらかったら、後の方の作例を先に見た方が理解が早いかもしれない。

“ggplot2”のコンセプト

“ggplot2”は、どのように作図を行っているのであろうか。技術的な側面はおき、直感的な説明をしてみよう。“ggplot2”では、層(レイヤー)をどんどん重ねることで図を作成している。

手書きやRのデフォルトの作図コマンドで図を描く場合のイメージ。色んなものを一気に図に表す。
手書きやRのデフォルトの作図コマンドで図を描く場合のイメージ。色んなものを一気に図に表す。

これは、手書きによる作図やRのデフォルトの作図コマンドと対象的である [1] 。手書きやRのデフォルトの作図コマンドは、紙の上に一気に情報を書き入れる形式であると言えよう。一度に処理できるから楽といえば楽だが、後から付け加えたり修正したりするのは難しい。例えば、10刻みで軸に目盛りを書き込んだ後に、100刻みの目盛りに変えようと言っても難しいのである。

“ggplot2”で図を描く場合のイメージ。層(レイヤー)を重ねていく。
“ggplot2”で図を描く場合のイメージ。層(レイヤー)を重ねていく。

“ggplot2”は層を重ねることで図を作成しており、必要に応じて層を増減しやすい。このため、修正などが楽になり、保守性も高くなっている。この点、オブジェクト指向プログラミングに似た面を持っていると言えよう。

“ggplot2”の作図の流れは以下の通りである。

  1. ggplotコマンド [2] で、図示したいデータをデータフレームの形で読み込む。この際、“aes”の指定で、読み込んだデータフレームの何を図示したいのかを指定する。
  2. データをどう図示するのか指定。
  3. 回帰直線などを付け加えたり、凡例や軸を変えたり、色やフォントを変えたりする。

R 本来の作図機能では、何を図示するのかということと、どう図示するのかということが渾然一体としている。「何を」と「どう」を分離しているのが “ggplot2”の特徴である。より具体的に言うと、R本来の作図機能では、まずどんなグラフを描くか(例えば点グラフにするのか、棒グラフにするの か)を決め、その際データを読み込む。これに対し、“ggplot2”では先にデータを読み込み、どんなグラフを描くかは後になるのである。

“ggplot2”のインストール方法

“ggplot2”は、Rの他のパッケージと同じように、CRANを通じダウンロードしてインストールすることができる。RのGUIメニューからインストールしても良いし、以下のようにコマンドを打ち込んでインストールしても良い。

install.packages("ggplot2", dependencies=TRUE)

事例:散布図を描く

下記の例では、仮想の英語テストの結果を散布図 [3] にする例である。

仮想の英語テストの結果
Reading(読み)542382384953
Writing(書き)613547523866

english.examというデータフレームのReadingが読みのテストの結果、Writingが書きのテストの結果を示している。

library(ggplot2)
english.exam = data.frame(
  Reading = c(54, 23, 82, 38, 49, 53),
  Writing = c(61, 35, 47, 52, 38, 66)
)
g = ggplot(english.exam, aes(Reading, Writing))
g + geom_point()
“ggplot2”を使った場合の散布図の例
“ggplot2”を使った場合の散布図の例

上記のコードを1行ずつ説明していこう。まず、1行目では、“ggplot2”パッケージを読み込んでいる。“ggplot2”パッケージは、Rのデフォルトの機能ではないので、このようにあらかじめ読み込んでおかないと使うことができない。次に、2から5行目では、英語の試験の結果に関するデータフレームを作成している。

6行目では、ggplot コマンドを使い、データフレーム [4] を読み込んでいる。第一の引数で、対象とするデータフレームが english.exam であると指定している。さらに、aes(Reading, Writing) で、データフレームの中でも表現したい部分は、Readingと Writing なのだということを指定している。そして、描画用にデータフレームを読み込んだ情報を、gに代入している。最後の7行目では、データフレームを読み込んだ情報であるところのgに、散布図の層(レイヤー)、すなわち geom_point() を加えることで、散布図を描いている。

散布図に回帰直線を加えた例。このように図にさまざまな層を重ねることができる。
散布図に回帰直線を加えた例。このように図にさまざまな層を重ねることができる。

上記の例では、層(レイヤー)を1枚しか重ねなかったが、もっと重ねることもできる。例えば、上記の例の最後の行に stat_smooth(method = “lm”) という記述を加え、以下のようにすると、回帰直線が付け加えられる。

g + geom_point() + stat_smooth(method = "lm")

このような要領で足し算の形で層を重ねることでさまざまな図を描くことができるのである。

もっと学びたい人のために

“ggplot2”でどんなことができるのかについてもっと知りたい人は、まず“ggplot2”の公式Webサイトを訪れてみよう。さまざまな実例が載っているので、参考になるだろう。英語で書かれているページだが、図の例とコマンドを追うだけでも理解できるはずである。

また、解説書(英語)も出版されているので、参考にすると良いだろう。

脚注
  1. 2015年3月30日:この文誤字修正 []
  2. なお、“ggplot2”での作図は、ggplotコマンドを使うものの他に、qplotコマンドというものがある。ggplotコマンドを使う方法では段階的に図を作成していくが、qplotコマンドは一気に図を作成する。qplotコマンドは簡易に図を作成できるという利点があるが、柔軟性にややかける感がある。なお、qplotとは、“quick plot”の略である。 []
  3. なお、ここでは簡単のために6つのデータしか載せていないが、実際散布図を描く際にはもっと多くのデータを扱うことが多い。 []
  4. “ggplot2”の場合、読み込むデータは基本的にデータフレームである。ベクトルを直接読み込ませるということはできなくはないが、しないようにする。 []