はじめに
「二つのグループのデータを色分けして散布図で示したい!」
そんなことは多々あることです。
エクセルでは二つのグループを分けて打ち込んだうえで、「挿入>散布図」で簡単に作成することができます。
ではかっこつけてRを用いて散布図を重ねる場合はどうすればよいのでしょうか。
今回はRのファンクションの一つであるplotを用いて重ねる方法について考えてみたいと思います。
なお、plotの基本的な使い方については以下の記事で紹介しております。
こちらも参考にしていただけると幸いです。
plotで作成した散布図をpar(new=T)やadd=Tを使って重ねてみる
Rでグラフを重ねる方法としてpar(new=T)を使う、add=Tをplotの変数に加える方法があります。
そこで、先ほど図1で示したデータについてmaleとfemaleのそれぞれの散布図をadd=Tを用いて重ねてみると、、
> plot(male$a,male$b)
> plot(female$a,female$b,add=T)
警告メッセージ:
1: plot.window(...) で: "add" はグラフィックスパラメータではありません
2: plot.xy(xy, type, ...) で:
"add" はグラフィックスパラメータではありません
3: axis(side = side, at = at, labels = labels, ...) で:
"add" はグラフィックスパラメータではありません
4: axis(side = side, at = at, labels = labels, ...) で:
"add" はグラフィックスパラメータではありません
5: box(...) で: "add" はグラフィックスパラメータではありません
6: title(...) で: "add" はグラフィックスパラメータで
このように怒られてしまいます、、、
散布図を重ねるときはadd=Tは使えないみたいです。
次にpar(new=T)を使って重ねてみたいと思います。
同様にやってみると、、、
> plot(male$a,male$b)
> par(new=T)
> plot(female$a,female$b)
このように二群のデータの散布図を重ねることができました。
しかし、目盛りや軸ラベルがずれてしまい非常に汚いです。
そこで以下の三つの処理をします。
- 目盛りを0~1に揃えるためにxlim(0:1),ylim(0:1)を加える
- 軸ラベルを一つにするためにmaleの散布図はxlab=””,ylab=””、femaleの散布図はxlab=”a”,ylab=”b”にする
- femaleのプロットの色を黒に変えるためにpch=19を指定する。
この結果以下のようなコードになります。
> plot(male$a,male$b,xlim=(0:1),ylim=(0:1),xlab="",ylab="")
> par(new=T)
> plot(female$a,female$b,xlim=(0:1),ylim=(0:1),pch=19,xlab="a",ylab="b")
そして以下のような図が出力され、目的が達成されました!
データフレームにプロットの形を指定する列を加える
par(new=T)を用いるほかにデータフレーム自体にプロットの形を指定する列を加える方法でも二群のデータの散布図を色分けて表示することができます。
例えば以下のようなデータを用意します。
a b sex
1 0.91999065 1.33398644 male
2 0.88684948 0.64740012 female
3 0.87589737 0.69195893 female
4 0.84712385 1.16055967 male
5 0.55660665 0.76255112 male
6 0.49981023 0.63975709 male
7 0.49701369 0.42743178 female
8 0.42325633 0.22432586 female
9 0.40077213 0.20840151 female
10 0.39514841 0.37539099 female
11 0.37980154 0.33802337 female
12 0.33850896 0.47391254 male
13 0.31426244 0.18855746 female
14 0.27165031 0.45365601 male
15 0.26794387 0.36976254 male
16 0.26738015 0.20320891 female
17 0.25928166 0.15297618 female
18 0.21551211 0.27370038 male
19 0.16585548 0.15922126 female
20 0.12184773 0.13403250 male
21 0.10121605 0.20141993 male
22 0.07142226 0.08856361 male
23 0.04276315 0.02950657 female
24 0.02498241 0.03722380 male
これを一つ一つ性ごとに分けてからデータフレームに入れて散布図を作るのは大変です、、、
そこでプロットの形を指定する列を加えたいと思います。
そのためにifelse()という関数を以下のように使います。
test$pch<-ifelse(test$sex=="male",21,19)
このコードはsexが”male”のとき21,それ以外の時19を出力するpchという列をデータフレームtestに生成するという意味です。
この結果以下のようにpchという列が生成されます。
a b sex pch
1 0.91999065 1.33398644 male 21
2 0.88684948 0.64740012 female 19
3 0.87589737 0.69195893 female 19
4 0.84712385 1.16055967 male 21
5 0.55660665 0.76255112 male 21
6 0.49981023 0.63975709 male 21
7 0.49701369 0.42743178 female 19
8 0.42325633 0.22432586 female 19
9 0.40077213 0.20840151 female 19
10 0.39514841 0.37539099 female 19
11 0.37980154 0.33802337 female 19
12 0.33850896 0.47391254 male 21
13 0.31426244 0.18855746 female 19
14 0.27165031 0.45365601 male 21
15 0.26794387 0.36976254 male 21
16 0.26738015 0.20320891 female 19
17 0.25928166 0.15297618 female 19
18 0.21551211 0.27370038 male 21
19 0.16585548 0.15922126 female 19
20 0.12184773 0.13403250 male 21
21 0.10121605 0.20141993 male 21
22 0.07142226 0.08856361 male 21
23 0.04276315 0.02950657 female 19
24 0.02498241 0.03722380 male 21
このデータフレームを用いてplot関数にpch=test$pchを加えると二群のデータの散布図が色分けされたグラフが出力されます。
plot(test$a,test$b,pch=test$pch)
実際扱うデータはカテゴリーがごちゃ混ぜであることも多く、こっちの方が便利かもしれません、、、
終わりに
二群のデータの散布図を色分けして表示する方法について今回分かったことは以下の通りです。
- add=Tは使えない
- par(new=T)は使えるけど調整が必要
- データフレームにプロットの形を指定する列を作る方法もある
エクセルより難しかったですが、なんかかっこいいですね(笑)
今後もきれいな図を作成できるように頑張っていきたいと思います。
コメント