目的 レーダーチャートを描く 使用法 radar(df, max=NULL, min=NULL, z.score=TRUE, col=2, lty=1, title="") 引数 df データフレームまたはデータ行列 max 変数値の上限(変数単位ならベクトルで,全部一緒なら定数で)NULL なら計算 min 変数値の下限(変数単位ならベクトルで,全部一緒なら定数で)NULL なら計算 z.score データを正規化してプロット col 線の色(データ単位ならベクトルで,全部一緒なら定数で) lty 線の種類(データ単位ならベクトルで,全部一緒なら定数で) title グラフのタイトル ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/radar.R", encoding="euc-jp") radar <- function( df, # データフレームまたはデータ行列 max=NULL, # 変数値の上限(変数単位ならベクトルで,全部一緒なら定数で)NULL なら計算 min=NULL, # 変数値の下限(変数単位ならベクトルで,全部一緒なら定数で)NULL なら計算 z.score=TRUE, # データを正規化してプロット col=2, # 線の色(データ単位ならベクトルで,全部一緒なら定数で) lty=1, # 線の種類(データ単位ならベクトルで,全部一緒なら定数で) title="") # グラフのタイトル { draw.net <- function(x, border, lty) # 1個のデータの描画 { scale <- (x-min)/(max-min) # 描画に使う値に変換 if (0 < scale && scale <= 1.2) { # 範囲外のときのみ描画(z.score=TRUE のときのみ有効) polygon(sine*scale, cosine*scale, # 多角形を描画 border=border, lty=lty) } } if (!is.data.frame(df) && !is.matrix(df)) { # オブジェクトの種類 stop("行列かデータフレームであるべし!") } m <- ncol(df) # 変数の個数 if (m < 3) { stop("3変数以上であるべし!") } plot(c(-1.2,1.2),c(-1.2,1.2), type="n", axes=FALSE, # 描画の枠組み xlab="", ylab="", main=title, asp=1) theta <- pi*(0.5-0:(m-1)*2/m) # 90 度から右回りで測る角度 sine <- cos(theta) # 正弦 cosine <- sin(theta) # 余弦 if (z.score) { # 正規化してプロットするとき df <- scale(df) # 変数ごとに正規化 max <- max(df) # 変数ごとの最大値 min <- min(df) # 変数ごとの最小値 w <- (max-min)*0.1 # マージン max <- max+w # マージンを拡大 min <- min-w # マージンを拡大 sapply(-3:3, function(i) # 1ごとに目盛り枠を描画 draw.net(i, border="gray", lty=ifelse(i==0, 1, 3))) } else { # 生データのままプロット if (is.null(max)) { # 最大値の指定がないとき max <- apply(df, 2, max) # 最大値を求める } if (is.null(min)) { # 最小値の指定がないとき min <- apply(df, 2, min) # 最小値を求める } w <- (max-min)*0.1 # マージン max <- max+w # マージンを拡大 min <- min-w # マージンを拡大 sapply(1:5, function(i) # 目盛り枠を描画 polygon(sine*i/5, cosine*i/5, lty=3, border="gray")) } arrows(0, 0, sine*1.1, cosine*1.1, length=0, # 軸を描画 col="gray") half <- floor((m+1)/2) # 右半分と左半分を分ける text(sine*1.2, cosine*1.2, labels=colnames(df), # ちょっと手を掛ける pos=rep(c(4, 2), c(half, m-half))) n <- nrow(df) # サンプルサイズ if (length(col) == 1) { # 要素が 1 個のとき col <- rep(col, n) # ベクトルに拡大 } if (length(lty) == 1) { # 要素が1個のとき lty <- rep(lty, n) # ベクトルに拡大 } junk <- sapply(1:n, function(i) # 描画 draw.net(df[i,], col[i], lty[i])) } 使用例 > test <- swiss[1:5,] # swiss データセットの最初の5件 > test Fertility Agriculture Examination Education Catholic Infant.Mortality Courtelary 80.2 17.0 15 12 9.96 22.2 Delemont 83.1 45.1 6 9 84.84 22.2 Franches-Mnt 92.5 39.7 5 5 93.40 20.2 Moutier 85.8 36.5 12 7 33.77 20.3 Neuveville 76.9 43.5 17 15 5.16 20.6 一番単純に(標準化して描画) > radar(test) ケースの色分け > radar(test, col=c("black", "red", "green4", "blue", "brown")) 変数ごとに最大値を指定(標準化しない) > radar(test, max=c(100, 50, 20, 20, 100, 25), z.score=FALSE, col=c("black", "red", "green4", "blue", "brown")) 変数ごとに最大値と最小値を指定(標準化しない) > radar(test, max=c(100, 50, 20, 20, 100, 25), min=c(70, 10, 0, 0, 0, 20), z.score=FALSE, col=c("black", "red", "green4", "blue", "brown")) 全変数共通の最大値と最小値を指定(標準化しない) > radar(test, max=100, min=0, z.score=FALSE, col=c("black", "red", "green4", "blue", "brown")) iris データの 3 種の違いを描き分ける > g <- as.integer(iris[,5]) > radar(iris[,1:4], col=g, lty=g)