レーダーチャート Last modified: Feb 07, 2025
目的
レーダーチャートを描く
使用法
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 (all(0 < scale) && all(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)
直前のページへ戻る
E-mail to Shigenobu AOKI