ggplot2についてちょっと勉強した(1)

ggplot2について

要するにRでちょっとカッコイイグラフが簡単に作れるアレ。
リファレンスマニュアルを読んだのでノートを書く。
とりあえずhttp://had.co.nz/ggplot2/geom_abline.htmlを読んだ。点の打ち方と線の引き方。
まあでもぶっちゃけhttp://had.co.nz/ggplot2/geom_abline.htmlを省略しつつ訳しただけのようなものなのであまり面白くn*1(ry

ノート

使われるデータセットについて
  • 自動車のデータ
  • ?mtcars
  • 1974年のMotor Trend US紙から抽出
  • 燃費ほか10の項目、32車種分のデータ
  • mpg: 燃費(Miles/(US)gallon)
  • cyl: シリンダー数
  • disp:排気量(立方インチ?)
  • hp: 馬力
  • wt: 重量(ポンド/1000)
  • qsec:1/4マイルのタイム
  • vs: V/S(?)
  • am: トランスミッション(0: オートマ, 1:マニュアル)
  • gear:ギア数
  • carb:キャブレター数
qplot
  • plotみたいなもの
  • plotと同じような感じで散布図がかける
  • ちょっとカッコイイ
qplot(wt, mpg, data = mtcars)
p <- qplot(wt, mpg, data = mtcars)  ## 後で使うのでしまっておく

geom_abline
  • abline()みたいなもの
  • ほかのプロットの上に線を引く低水準作図関数

ggplot2の場合、低水準作図関数は後で使うんじゃなくて同時に使う。高水準作図関数の後ろに+で低水準作図関数を足していく。

p + geom_abline(intercept = 20)         #切片指定


単体で使うとパラメータの一覧みたいなのが返ってくるので、低水準作図関数で高水準作図関数のパラメータを指定するような感じなんだろうか。

外観の設定

geom_abline()の引数を指定してやることで見た目の変更ができる。半透明の線とかも引ける。

p + geom_abline(intercept = 10,
                colour = "red",         # 色(Default: black)
                size = 2,               # 太さ(Default: 1)
                linetype = 2,           # 線種(Default: 1)
                alpha = 0.5)            # 透明度(Default: 1)

coef

ggplotとは関係ない。statsパッケージに入ってる。
lmオブジェクトに使うと回帰係数だけ返してくれる。
調べた回帰係数を指定するとそれっぽく線を引けるよという例。

coef(lm(mpg ~ wt, data = mtcars))       #回帰係数確認
## > coef(lm(mpg ~ wt, data = mtcars))
## (Intercept)          wt 
##   37.285126   -5.344472
## 係数を指定してやる、それっぽい
p + geom_abline(intercept = 37, slope = -5)

stat_smooth

もちろん実際にはこんな面倒なことをする必要はなくて、stat_smoothという関数を使うとfittingができる

p + stat_smooth(method = "lm",
                se = FALSE)             # TRUE(デフォルト)にすると標準誤差(たぶん)
                                        # が半透明で表示されてカッコイイ

aes

aes()を使うと複数の引数を同時に与えられる?詳しい使い方がよくわからない。普通に引数指定するときにも使うっぽい。

## aes()を使って複数の引数を同時に与えられる
p <- ggplot(mtcars,                     # data = は第一引数
            aes(x = wt, y = mpg),
            . ~ cyl) + geom_point()
df <- data.frame(a = rnorm(10, 25), b = rnorm(10, 0))
p + geom_abline(aes(intercept = a, slope = b), data = df)

ddply

ddply()関数はsplitとapplyを組み合わせたような関数で、指定の列でsplitした結果のそれぞれに対して関数を適用する。関数はデータフレームを返す必要がある。

## 線型モデルに従って切片と傾きを求める
coefs <- ddply(mtcars, .(cyl),
               function(df){
                 m <- lm(mpg ~ wt, data = df)
                 data.frame(a = coef(m)[1], b = coef(m)[2])
                          }
                 )
## 上の例だとmtcarsのcyl列で分割したデータフレームに対し、
## それぞれ回帰係数を求めている
## coef()関数は係数だけ返してくれる
## > coefs
##   cyl        a         b
## 1   4 39.57120 -5.647025
## 2   6 28.40884 -2.780106
## 3   8 23.86803 -2.192438
## > str(coefs)
## 'data.frame':	3 obs. of  3 variables:
##  $ cyl: num  4 6 8
##  $ a  : num  39.6 28.4 23.9
##  $ b  : num  -5.65 -2.78 -2.19

これとさっきのaes()を組み合わせると条件別に回帰直線が!

## 3本の回帰直線をプロットする
p + geom_abline(aes(intercept = a, slope = b),
                data = coefs)

geom_smooth

もちろんこんな面倒なことをする必要は(ry
geom_smoothにgroup=をaesで指定してやることによりグループごとのfittingができる。デフォルトだと範囲も適当に切ってくれるのでいい感じになる。

p + geom_smooth(aes(group = cyl), method = "lm")  ## デフォルト
p + geom_smooth(aes(group = cyl), method = "lm",
                fullrange = TRUE, se = FALSE)     ## 上でやったようなやつ



とりあえずこれだけ。
細かいところでよく分からない部分はあるけど散布図くらいは描けるようになったような気が。
V/Sってなんだろう…。
(追記:直列(Straight)とV型の区別らしい。id:wakuteka ++。ちなみにロータリーは直列、水平対向はV型に分類されてる。)

*1:気持ち説明追加してます