Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Rの初歩 - グラフの描画、重ね合わせ

確率・統計の復習がてら、Rにも習熟しようと思いたった。このエントリーでは次の話題を取り扱う。

  1. R環境の準備:RとRStudioのインストールする。
  2. ライブラリの導入:Excelの読み込みと、基本的な関数の使用を実現する。
  3. Excelの読み込み操作。
  4. 基本的な操作
  5. グラフの描画と重ね合わせ
  6. R Notebook

このエントリーでは、5を取り上げる。
1-4の話題は次のエントリを参照する。
Rの初歩 - 環境設定 - Technically Impossible
Rの初歩 - 基本操作 - Technically Impossible

追記、2021年1月24日
この投稿で紹介する方法もよいが、Tidyverseの方法は直観的、単純で分かりやすく、効率的だ。Tidyverseについての投稿でもグラフ描画、重ね合わせの話題に触れている。合わせて参照してほしい。
Rの初歩 - Tidyなやり方 Tidyverse - Technically Impossible

Rではグラフの描画も、関数を呼び出すことで出力することができる。グラフはRStudio右下のペイン、Plotsタブに出力される。
week3$Ageの年齢分布をヒストグラムで出力してみる。

hist(week3$Age)

f:id:espio999:20180214222900p:plain

同じデータを箱ひげ図で表示してみる。

boxplot(week3$Age, horizontal=TRUE)

f:id:espio999:20180214222916p:plain

グラフの重ね合わせ1

箱ひげ図、それぞれの領域の内訳を知るには、各データの分布を重ねて描画すると分かりやすい。例えば次の散布図を重ねて描画するとして、

stripchart(week3$Age, method="stack")

f:id:espio999:20180214223000p:plain

コードは次のようになる。

boxplot(week3$Age, horizontal=TRUE)
par(new=TRUE)
stripchart(week3$Age, method="stack")

f:id:espio999:20180214223025p:plain

注意しなければならないのは、Rには

  • 高水準、低水準の作図関数があること。
  • 高水準作図関数は新規に描画を開始すること。
  • 低水準作図関数は現在の描画領域に描画を追加すること。

そのため、高水準作図関数同士の重ね合わせには、par関数を用いて画面の更新設定を明示する必要がある。

グラフの重ね合わせ2

今回の重ね合わせでは、たまたま箱ひげ図と散布図の軸、目盛りが一致しているため、単純に重ね合わせるだけでも問題がなかった。重ね合わせるグラフの軸や目盛りが異なる場合には、重ね合わせに際し、それらを整合させる必要がある。

例えばヒストグラムと散布図を重ね合わせるとする。ヒストグラムはhist関数内のデフォルト・オプションによって軸と目盛りが自動調整されている。そのため重ね合わせに際し、その範囲を2つ目の作図関数へ反映させなければならない。指定すべき範囲を特定するため、ヒストグラム関数の中身を確認する。

> print(hist(week3$Age))
$breaks
 [1] 20 25 30 35 40 45 50 55 60 65 70 75

$counts
 [1]  9 12 21  8  7  6  9 12  7  5  4

$density
 [1] 0.018 0.024 0.042 0.016 0.014 0.012 0.018 0.024 0.014 0.010 0.008

$mids
 [1] 22.5 27.5 32.5 37.5 42.5 47.5 52.5 57.5 62.5 67.5 72.5

$xname
[1] "week3$Age"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

$breaksにグラフの範囲が定義されており、その最小値、最大値を2つ目の作図関数へ引き渡せば良さそうだと推察できる。$breaksの最小値、最大値を取り出すには

> temp=hist(week3$Age)
> min(temp$breaks)
[1] 20
> max(temp$breaks)
[1] 75

hist関数は実行するたびにグラフを描画する。複数回の描画を避けるため、1回目の描画と同時に値を変数tempへ格納し、$breaksの値をtemp経由で取得している。

この結果を踏まえて重ね合わせに対応する。累積和のヒストグラムを表示し、散布図も累積和に応じたレイアウトを重ねて表示する。

> par(mfcol=c(3,1))
> temp$counts=cumsum(hist(week3$Age)$counts)
> plot(temp, axes=F, xlab="", ylab="", main="")
> par(new=T)
> plot(sort(week3$Age), 1:length(week3$Age), xlim=c(min(temp$breaks), max(temp$breaks)))

以下コードの説明。
描画画面を3行、1列に分割し描画することにする。
ヒストグラムを描画すると同時に、その$countsの累積和を変数tempの$countsへ代入する。
tempのヒストグラムを表示する。累積和のヒストグラムが表示される。グラフの軸やラベルなどの文字列を表示しないオプションを指定している。
次のグラフを、累積和のヒストグラムに重ねて描画する。
week3$Ageの散布図を表示する。今回(x、y)の2次元配置で描画する。
x:ソートしたweek3$Age
y:1からweek3$Ageのデータ数。1点描画するごとにyは1からデータ数の最大値まで増加していく。
描画するグラフのx軸は、累積和のヒストグラムの最小値から最大値の範囲とする。
f:id:espio999:20180214223336p:plain

追記、2021年1月24日

この投稿で紹介する方法もよいが、Tidyverseの方法は直観的、単純で分かりやすく、効率的だ。Tidyverseについての投稿でもグラフ描画、重ね合わせの話題に触れている。合わせて参照してほしい。
impsbl.hatenablog.jp