ggplot2のqplot関数のまとめ

Rのステキグラフィックスライブラリ「ggplot2」のqplot関数についてまとめてみた.少し頑張りすぎた.

関連記事:ggplot2の概要 - ぬいぐるみライフ?

qplot関数とは

ggplot2にはqplot(Quick PLOTの略)というステキな関数が用意されている.これを使うと,デフォルトの設定のままでもRのbaseライブラリ(plot関数など)と比べてきれいな図が描ける上に,色付けや凡例の設定もある程度よしなにやってくれる.

以降,ggplot2のqplot関数について詳しく見ていくことにしよう.

この記事の構成

最初に,qplot関数について以下のことをチェックする.

  • qplot関数の基本
  • qplot関数のdataパラメータ

次に,以下のグラフについてbaseライブラリとggplot2のqplot関数の間でシンタックスの違いや描画されるグラフを比較していく.

  • 散布図
  • 折れ線グラフ
  • 棒グラフ
  • ヒストグラム
  • 密度プロット
  • 箱ひげ図
  • 条件付きプロット

最後にbaseライブラリの低水準作図関数とggplot2のレイヤーの対応関係を確認する.

  • 低水準作図関数とレイヤー

また,この記事ではggplot2パッケージ付属のdiamondsデータとeconomicsデータをサンプルとして使っていく.

> library(ggplot2)
> head(diamonds)
  carat       cut color clarity depth table price    x    y    z
1  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
2  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
3  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
4  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
5  0.31      Good     J     SI2  63.3    58   335 4.34 4.35 2.75
6  0.24 Very Good     J    VVS2  62.8    57   336 3.94 3.96 2.48
> dim(diamonds)
> head(economics)
        date   pce    pop psavert uempmed unemploy
1 1967-06-30 507.8 198712     9.8     4.5     2944
2 1967-07-31 510.9 198911     9.8     4.7     2945
3 1967-08-31 516.7 199113     9.0     4.6     2958
4 1967-09-30 513.3 199311     9.8     4.9     3143
5 1967-10-31 518.5 199498     9.7     4.7     3066
6 1967-11-30 526.2 199657     9.4     4.8     3018
> dim(economics)
[1] 478   6

各サンプルデータの詳細についてはヘルプを参照.

> ?diamonds
> ?economics

qplot関数の基本

qplot関数はbaseライブラリのplot関数のような感覚で使うことができる.

> qplot(carat, price, data = diamonds, colour = clarity)

色とデータの対応付けや軸のラベルなどはqplot関数がよしなにやってくれる.

> qplot(carat, data = diamonds, geom = "density", colour = cut)

わーお,きれいな図.

(TODO:色などの指定方法について書く)

qplot関数のdataパラメータ

Rで作図する際に,描画対象のデータがデータフレームであるケースはかなり多い.データフレームの各列は$を使うことで簡単にアクセスできる.

> head(diamonds)
  carat       cut color clarity depth table price    x    y    z
1  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
2  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
3  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
4  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
5  0.31      Good     J     SI2  63.3    58   335 4.34 4.35 2.75
6  0.24 Very Good     J    VVS2  62.8    57   336 3.94 3.96 2.48
> head(diamonds$price)
[1] 326 326 327 334 335 336

しかし,データフレームの列をdiamonds$〜のように指定しつつqplot関数でグラフを作ろうとすると,以下のようにコードが冗長になり,自動的につけられた軸のラベルや凡例に"diamonds$"がついて煩わしくなるといった問題が発生する.

> qplot(diamonds$carat, diamonds$price, colour = diamonds$clarity)

qplot関数のdataパラメータを使うと,以下のようにデータフレームの列の名前だけでプロットするデータを指定できるようになる.こうすることで出来上がった図のラベルや凡例もすっきりする.

> qplot(carat, price, data = diamonds, colour = clarity)

qplot関数でデータフレームをグラフ化する場合は,dataパラメータを積極的に使っていくようにした方がいいだろう.


散布図

以降,様々な図についてbaseライブラリとqplot関数の具体例を確認しながら比較していこう.

散布図はデータを点で平面上にプロットするだけの基本的な図だ.

plot(x, y)  # base
qplot(x, y) # ggplot2

具体例.

> plot(diamonds$carat, diamonds$price)
> qplot(carat, price, data = diamonds)



折れ線グラフ

折れ線グラフは時系列データの可視化の際によく使われる.

plot(x, y, type = "l")     # base
qplot(x, y, geom = "line") # ggplot2

具体例.

> plot(economics$date, economics$unemploy, type = "l")
> qplot(date, unemploy, data = economics, geom = "line")



棒グラフ

おなじみの棒グラフ.

barplot(x)                                          # base
qplot(names(x), x, geom = "bar", stat = "identity") # ggplot2

値の頻度を棒グラフで表示する場合は以下の通り.

barplot(table(x))      # base
qplot(x, geom = "bar") # ggplot2

xが離散値の場合,qplot関数のgeom = "bar"は省略できる.

具体例.

> table(diamonds$color)
    D     E     F     G     H     I     J
 6775  9797  9542 11292  8304  5422  2808
> barplot(table(diamonds$color))
> qplot(color, data = diamonds)



ヒストグラム

データの度数分布を可視化する図.

hist(x)                      # base
qplot(x, geom = "histogram") # ggplot2

hist関数はbinsで,qplot関数はbinwidthでヒストグラムの幅を調節できる.

hist(x, bins = 100)
qplot(x, geom = "histogram", binwidth = 1)

xが連続値の場合,qplot関数のgeom = "histogram"は省略できる.

具体例.

> hist(diamonds$price)
> qplot(price, data = diamonds)



密度プロット

ヒストグラムと同じくデータの分布を示す図.こちらはカーネル密度推定を使っている.

plot(density(x))           # base
qplot(x, geom = "density") # ggplot2

具体例.

> plot(density(diamonds$price))
> qplot(price, data = diamonds, geom = "density")



箱ひげ図

複数のデータの分布を比較するのに便利な図.

boxplot(y ~ x)                # base
qplot(x, y, geom = "boxplot") # ggplot2

具体例.

> boxplot(diamonds$carat ~ diamonds$cut)
> qplot(cut, carat, data = diamonds, geom = "boxplot")



条件付きプロット

指定した変量の値の範囲ごとにデータの散布図を作ることができる.

coplot(y ~ x | z)         # base
qplot(x, y, facets = ~ z) # ggplot2

具体例.

> coplot(diamonds$price ~ diamonds$carat | diamonds$cut)
> qplot(carat, price, data = diamonds, facets = ~ cut)



低水準作図関数とレイヤー

Rのbaseライブラリの低水準作図関数はそれぞれ以下のggplot2のレイヤーと対応している.

base functionsggplot2 layers
curve()geom_curve()
hline()geom_hline()
lines()geom_line()
points()geom_point()
polygon()geom_polygon()
rect()geom_rect()
rug()geom_rug()
segments()geom_segment()
text()geom_text()
vline()geom_vline()
abline(lm(y ~ x))geom_smooth(method = "lm")
lines(density(x))geom_density()
lines(loess(x, y))geom_smooth()

Rのbaseの低水準作図関数は,先にplot関数でグラフを描画してから実行することでグラフ上に図形を追加する.

plot(x, y)
lines(x, y)

qplot関数の場合は,以下のようにqplot()の戻り値に対してレイヤーを追加することで描画できる.

qplot(x, y) + geom_line()

以上

qplot関数を使うとデフォルトのままでもbaseライブラリよりもきれいなグラフが描ける.qplot関数+レイヤーという具合にインターフェイスに一貫性がある点も重要なポイントだ(barplotやhistのような他の関数を呼び出す必要がほとんどない).

まだggplot2を触ったことがない人は是非次回Rを使う時に試してみよう.

参考資料