レーダーチャート     Last modified: Feb 15, 2008

目的

レーダーチャートを描く

使用法

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)
fig

ケースの色分け
> radar(test, col=c("black", "red", "green4", "blue", "brown"))
fig

変数ごとに最大値を指定(標準化しない)
> radar(test, max=c(100, 50, 20, 20, 100, 25), z.score=FALSE, col=c("black", "red", "green4", "blue", "brown"))
fig

変数ごとに最大値と最小値を指定(標準化しない)
> 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"))
fig

全変数共通の最大値と最小値を指定(標準化しない)
> radar(test, max=100, min=0, z.score=FALSE, col=c("black", "red", "green4", "blue", "brown"))
fig

iris データの 3 種の違いを描き分ける
> g <- as.integer(iris[,5])
> radar(iris[,1:4], col=g, lty=g)
fig


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh