R苦手の会#9

今回で9回目です.
前回に引き続いてid:wakutekaさんにおんぶにだっこでRグラフィックスの中身を紹介してもらおうぜな会です.

今回はlatticeパッケージでプロットするとき,データをグループに分ける方法なんかを勉強しました.

メモ

使用しているデータセットについて

フィジー周辺で1964年以降に発生した地震のデータ.
緯度,経度,震源の深さ,マグニチュードといったデータを含む.

連続変数を基準にグループを作成し,プロットする

震源の深さを基準にデータを3グループに分割し,グループごとに地震の発生箇所をプロットする例.

## 一変数を基準にグループ作成
depthgroup <- equal.count(quakes$depth, number=3, overlap=0)
## グラフィックスパラメータの設定
trellis.par.set(list(dot.symbol=list(pch=1)))
trellis.par.set(list(layout.widths = list(
                       left.padding=0,
                       right.padding=0,
                       ylab.axis.padding=0,
                       axis.right=0,
                       key.ylab.padding=0)))
## 描画
print( xyplot(lat ~ long | depthgroup, data=quakes, pch=".") )


equal.count()関数はshingleクラスのオブジェクトを返す.このオブジェクトをモデル式の|の左辺に渡すことでグループ別にプロットできる.
なお,shingle()関数が連続値のデータをグループに分割する基本的な関数で,その分割結果がshingleクラスのオブジェクト.そしてグループは範囲を重複させられる.

  • cf. cut()関数.連続変数をグループに分割し因子型のベクトルを作成.ただしcut()関数はその特性上範囲を重複させられない.

equal.count()関数はshingle()関数の仲間で,各グループのサイズを同じにしたいときに使用する.上記の例のようにnumber=3とすれば,同じだけの例数を含むグループが3つできる.例数を同じにする関係で多少重複する場合がある(のだと思う).
equal.count()関数のoverlap引数は重複させる割合を指定する.例えば0.5に設定すれば前後のインターバルで半数のデータが共有される.もし負の値を指定すればグループ間にギャップが生じる.
重複させた例

depth2 <- equal.count(quakes$depth, number=3, overlap=0.5)
print( xyplot(lat ~ long | depth2, data=quakes, pch=".") )


ギャップを生じさせた例

depth3 <- equal.count(quakes$depth, number=3, overlap=-0.5)
print( xyplot(lat ~ long | depth3, data=quakes, pch=".") )


また,間で指定しているtrellis.par.set関数は後でも触れるがグラフィックスパラメータを設定する関数でpar()と同じようなもの.

二つの変数を基準にグループを作成しプロットする例

地震震源地の深さとマグニチュードの2変数でそれぞれ分割し,2つのグループを組み合わせたグループごとに震源地をプロットする.

## 二変数でグループ作成
depthgroup <- equal.count(quakes$depth, number=3, overlap=0)
magnitude <- equal.count(quakes$mag, number=2, overlap=0)
## グラフィックスパラメータの設定
trellis.par.set(list(layout.widths=list(
                       left.padding=0,
                       right.padding=0,
                       ylab.axis.padding=0,
                       axis.right=0,
                       key.ylab.padding=0)))
## 描画
print(
xyplot(lat ~ long | depthgroup * magnitude,
       data=quakes,
       main="Fiji Earthquakes",
       ylab="latitude", xlab="longitude",
       pch=".",
       scales=list(x=list(alternating=c(1, 1, 1))),
       between=list(y=1),
       par.strip.text=list(cex=0.7),
       par.settings=list(axis.text=list(cex=0.7)))
)


depthは3つのグループに,magnitudeは2つのグループに分割している.
ポイントはxyplotに与えられているモデル式.右辺でdepthgroup * magnitudeとすることで2つのグループの組み合わせを作成している.

パラメータの設定と確認.

パラメータの設定はtrellis.par.set()関数で行う.par()と同じようなもので,デバイス毎に設定する.
show.settings()関数を利用すると,プロットしたときに設定がどのように反映されるかを実際のデバイス上で確認できる.

## プロット時の様子を確認
show.settings()

## パラメータを設定する
trellis.par.set(theme = canonical.theme())
trellis.par.set(list(fontsize=list(text=9, points=8)))


canonical.theme()はテーマを生成する関数.
なお,trellis.par.setで設定した設定値は.LatticeEnv環境に収納されるので,同じデバイスに出力する限りどこからでも同じ設定を参照できるし変更できる.というかしなければいけない.
もしある特定の一回のプロット中だけでローカルに変更したい場合はpar.settings引数を利用する.

## そのグラフにだけ反映
xyplot(lat ~ long, data=quakes,
       par.settings=list(fontsize=list(text=14,points=10)))

プロット位置の指定と重ね描き

sunspotsは1749年から1983年までの太陽の黒点数を納めた時系列データ.
高さを変えて同じプロットを2回する例.

spots <- by(sunspots, gl(235, 12, lab=1749:1983), mean)
plot1 <- xyplot(spots ~ 1749:1983, xlab="", type="l",
                main="Average Yearly Sunspots", 
                scales=list(x=list(alternating=2)))
plot2 <- xyplot(spots ~ 1749:1983, xlab="Year", type="l")
print(plot1, position=c(0, 0.2, 1, 1), more=TRUE)
print(plot2, position=c(0, 0, 1, 0.33))


position引数がプロット位置を決める.領域内の左下を(0, 0),右上を(1, 1)とみなし,4つの値のうち最初の2つでプロットの左下角の位置,続く2つで右上角の位置の座標を指定する.
print()にmore=TRUEを指定しておくと,次のプロットを描画したときにmore=TRUEを指定したプロットをクリアしない.par(new=TRUE)と同様(gridの場合はpar(new=TRUE)は使えない).