二群のデータの散布図を色分けして表示する方法【R備忘録】

スポンサーリンク

はじめに

「二つのグループのデータを色分けして散布図で示したい!」
そんなことは多々あることです。

エクセルでは二つのグループを分けて打ち込んだうえで、「挿入>散布図」で簡単に作成することができます。

図1. エクセルで作成した二群のデータを色分けした散布図

ではかっこつけてRを用いて散布図を重ねる場合はどうすればよいのでしょうか。
今回はRのファンクションの一つであるplotを用いて重ねる方法について考えてみたいと思います。

なお、plotの基本的な使い方については以下の記事で紹介しております。
こちらも参考にしていただけると幸いです。

plot関数の使い方 〜Rでグラフを作成するために〜


スポンサーリンク

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)
図2. par(new=T)で重ねた結果

このように二群のデータの散布図を重ねることができました。

しかし、目盛りや軸ラベルがずれてしまい非常に汚いです。
そこで以下の三つの処理をします。

  • 目盛りを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")

そして以下のような図が出力され、目的が達成されました

図3. par(new=T)で重ねた散布図を修正した結果
スポンサーリンク

データフレームにプロットの形を指定する列を加える

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)
図4. データフレームにプロットの形を指定する列を 加えることで作成した散布図

実際扱うデータはカテゴリーがごちゃ混ぜであることも多く、こっちの方が便利かもしれません、、、

スポンサーリンク

終わりに

二群のデータの散布図を色分けして表示する方法について今回分かったことは以下の通りです。

  1. add=Tは使えない
  2. par(new=T)は使えるけど調整が必要
  3. データフレームにプロットの形を指定する列を作る方法もある

エクセルより難しかったですが、なんかかっこいいですね(笑)
今後もきれいな図を作成できるように頑張っていきたいと思います。

コメント

タイトルとURLをコピーしました