箱ひげ図を描く(R)

参考になるサイト
データの中央値(メディアン)を中央の太線で、第3四分位数(75パーセンタイル)を箱の上辺で、第1四分位数(25パーセンタイル)を下辺で、上下のエラーバー端は(第1四分位数-1.5*(第3四分位数-第1四分位数)) 以上 (第3四分位数+1.5*(第3四分位数-第1四分位数)) 以下の範囲で、それぞれ最も大きいデータ点および最も小さいデータ点を指す。丸は外れ値であるとのこと。 関数はデフォルトで入っている、

boxplot()

を使い、データは、matrix型を用います。
まず適当にデータを作ってみます。

a <- matrix(rnorm(30),nrow=6,ncol=3)

正規乱数を30個発生させ、6行3列の行列を作りました。

colnames(a) <- c("box1","box2","box3")
> a
            box1       box2       box3
[1,]  0.08841506  0.1425491  0.2715243
[2,]  1.69399158 -0.6992151 -0.3714461
..

box1~3について箱ひげ図が作られます。こんな感じ。

渥美剛史

実験では、群a、bで異なる被験者数の場合もあるでしょう。
それら被験者ごとに、複数の条件で実験し、条件間のデータの比較をしたいとします。

group <- c("a","b")
a <- matrix(rnorm(30),nrow=6,ncol=5)
b <- matrix(rnorm(25),nrow=5,ncol=5)
x <- rbind(a,b)
y <- x
xn <- c(rep("a",1,length(a[,1])), rep("b",1,length(b[,1])))
cond <- matrix(1,length(xn))
cond[,1] <- xn
x <- cbind(cond,x)

11行(a群 n=6 + b群 n=5)×6列(文字列ラベル行1 + 条件数5)の行列で、例えば以下の様なデータになります。

> x
      [,1] [,2]                  [,3]                 [,4]                 [,5]                 [,6]                
 [1,] "a"  "0.173859622254333"   "0.725228539697822"  "-1.73026570829788"  "-0.463794123205335" "1.78706372667295"  
 [2,] "a"  "1.29801909407995"    "-1.67058514039805"  "-0.503542904882835" "-0.70823641708232"  "-0.416860435942581"
..
 [6,] "a"  "0.647190513131625"   "-0.757675322221295" "0.0795963058638695" "0.013484618365249"  "0.611849912096694" 
 [7,] "b"  "-0.81783442526267"   "-1.34854405012222"  "0.514496326110571"  "-2.45878952533466"  "-0.754799480813443"
 [8,] "b"  "-0.996345092679456"  "0.977489063246152"  "0.662600889521466"  "-2.8116663254168"   "-0.671809025840538"
..

行列xには、一列目に2種類のカテゴリを、2~6列目にはランダムな値が含まれます。

#png("boxplot1.png", width = 800, height = 400, bg = "transparent") # 描画の保存用デバイスを開く。(オプション)
cols <- c("red","blue")
par(mar=c(5,5,1,1))
plot(0,0,type="n",xlim=range(1:(ncol(y)*3))
	,ylim = c(-3,3),xlab="Xaxis",ylab="Yaxis", axes = FALSE, las=1, cex.lab=1.5, cex.axis=1.5)
for(i in 1:length(group)){
	boxplot(y[x[,1]==group[i],],at=c(1:ncol(y))*3-i+0.5,col=cols[i],xaxt="n",add=TRUE, las=1, lwd=3, cex.axis=1.3)
}
abline(h=0, lwd=3, lty="dotted")
axis(1, at=1:ncol(y)*3-1, labels=c("Cond1", "Cond2", "Cond3", "Cond4", "Cond5"), tick=TRUE, cex.axis=1.3)
#dev.off() #描画デバイスを閉じる。(オプション)

こんな感じになります。

渥美剛史

↑ PAGE TOP