グラフィックス参考実例集:箱型図 boxplot
(グラフィックス参考実例集に戻る。Rのグラフィックスパラメータを参照する。)
ご存知(とはいえ世間での認知度はほとんど零)箱型図(箱ひげ図)。関数boxplotは箱ひげ図と呼ばれるグラフを作図します。このグラフは、いくつかのデータの分布の違いを比較するのに有効です。 boxplotは任意個の引数をとって、それぞれに対する箱ひげ図を描きます。上下のひげは、それぞれ上(下)側四分位数の位置から、極値までの間に引かれます。極値とは、上(下)側四分位数から四分位範囲の 1.5 倍以内にあるデータのうちの最大(小)値です。極値よりも大きい、または小さい値は外れ値としてひげの先にプロットされます。 なお、boxplotにold=Tと指定することによって、S version 3.2 以前と同じスタイルの箱ひげ図を描くことができます。
boxplot1 <- function() { #モデル公式による箱型図 oldpar <- par(no.readonly = TRUE) # 現在のグラフィックスパラメータ退避 on.exit(par(oldpar)) # (関数がエラー中断しても) 終了時にパラメータ復帰 data(InsectSprays) # データ読み込み png("boxplot1.png") # png デバイスを開く boxplot(count ~ spray, data = InsectSprays, col = "lightgray") boxplot(count ~ spray, data = InsectSprays, notch = TRUE, add = TRUE, col = "blue") dev.off() # デバイスを閉じる }
boxplot2 <- function() { oldpar <- par(no.readonly = TRUE) # 現在のグラフィックスパラメータ退避 on.exit(par(oldpar)) # (関数がエラー中断しても) 終了時にパラメータ復帰 data(OrchardSprays) # データ読み込み png("boxplot2.png") # png デバイスを開く # 箱型図(縦軸は対数目盛) # 箱型図の基本情報取り出しのため変数 rb に付値 rb <- boxplot(decrease ~ treatment, log="y", data = OrchardSprays, col="bisque") title("Comparing boxplot()s and non-robust mean +/- SD") # 各ブロックの平均値と標準偏差のベクトル計算 mn.t <- tapply(OrchardSprays$decrease, OrchardSprays$treatment, mean) sd.t <- tapply(OrchardSprays$decrease, OrchardSprays$treatment, sd) # 箱の中心の x 座標 xi <- 0.3 + seq(rb$n) # 平均値を点プロット points(xi, mn.t, col = "orange", pch = 18) # 平均値±標準偏差の範囲を矢印で図示 arrows(xi, mn.t - sd.t, xi, mn.t + sd.t, code = 3, col = "pink", angle = 75, length = .1) dev.off() # デバイスを閉じる }
boxplot3 <- function() { oldpar <- par(no.readonly = TRUE) # 現在のグラフィックスパラメータ退避 on.exit(par(oldpar)) # (関数がエラー中断しても) 終了時にパラメータ復帰 ## 各種分布によるそれぞれ100個の疑似乱数を並べた行列 mat <- cbind(Uni05 = (1:100)/21, Norm = rnorm(100), T5 = rt(100, df = 5), Gam2 = rgamma(100, shape = 2)) png("boxplot3.png") # png デバイスを開く boxplot(data.frame(mat), main = "boxplot(data.frame(mat), main = ...)") par(las=1) # 軸ラベルをすべて水平に boxplot(data.frame(mat), main = "boxplot(*, horizontal = TRUE)", horizontal = TRUE) dev.off() # postscript デバイスを閉じる sd.t <- tapply(OrchardSprays$decrease, OrchardSprays$treatment, sd) # 箱の中心の x 座標 xi <- 0.3 + seq(rb$n) # 平均値を点プロット points(xi, mn.t, col = "orange", pch = 18) # 平均値±標準偏差の範囲を矢印で図示 arrows(xi, mn.t - sd.t, xi, mn.t + sd.t, code = 3, col = "pink", angle = 75, length = .1) dev.off() # デバイスを閉じる }
boxplot4 <- function() { data(ToothGrowth) # データ読み込み ## 箱の中心位置を at で指定 ## VC を与えた結果だけをまず描く(オプション subset= supp == "VC") png("boxplot4.png") # png デバイスを開く boxplot(len ~ dose, data = ToothGrowth, boxwex = 0.25, at = 1:3 - 0.2, subset= supp == "VC", col="yellow", main="Guinea Pigs' Tooth Growth", xlab="Vitamin C dose mg", ylab="tooth length", ylim=c(0,35)) ## オプション add=TRUE で重ね描き指定 ## オレンジジュースを与えた結果を次に描く(オプション subset = supp == "OJ") boxplot(len ~ dose, data = ToothGrowth, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2, subset= supp == "OJ", col="orange") ## 凡例を加える legend(2, 9, c("Ascorbic acid", "Orange juice"), fill = c("yellow", "orange")) dev.off() # デバイスを閉じる }
おまけにラグプロットまで。どうするとこういう使い方を思いつけるのか、ただ脱帽。注意すると最初に layout 関数で作図領域を4分割し、そのうちの3つに順に本図、y データの箱型図、x データの箱型図を描いている!
data(cars) op <- par() layout( matrix( c(2,1,0,3), 2, 2, byrow=T ), c(1,6), c(4,1),) par(mar=c(1,1,5,2)) plot(cars$dist ~ cars$speed, xlab='', ylab='', las = 1) rug(side=1, jitter(cars$speed, 5) ) rug(side=2, jitter(cars$dist, 20) ) title(main = "cars data") par(mar=c(1,2,5,1)) # この使い方がすごい boxplot を置く領域を指定している boxplot(cars$dist, axes=F) title(ylab='Stopping distance (ft)', line=0) # その領域にタイトルを置く工夫 par(mar=c(5,1,1,2)) # 同じく x 軸の下に boxplot を置く領域を指定している boxplot(cars$speed, horizontal=T, axes=F) title(xlab='Speed (mph)', line=1) par(op)