読者です 読者をやめる 読者になる 読者になる

ラベル視認性が(若干)高いbiplot

因子分析(や主成分分析)の結果をバイプロットすることがあります。因子分析の場合は、Rのbiplot()関数を使うと以下のように因子負荷量(赤矢印)と因子得点(黒数字)を表しています。

f:id:amarui:20140612192358p:plain

この図を作るのには、まず因子負荷量・因子得点っぽいダミーの値を準備しました。データ値は標準正規分布の乱数をそのまま使います。変数ラベルはなんでも良いのですが、Mac OS Xには/usr/share/dict下に英単語が入っているテキストファイルがあるので、そこからランダムに抜き出します。DTPやウェブサイトのデザインではプレースホルダ文章として「lorem ipsum」を使いますが、それっぽいことができます。

N <- 10

# ダミーの因子負荷量(と変数のラベル)を作成 ...変数の数はN
X <- matrix(rnorm(2 * N), ncol=2)
names.all <- read.table("/usr/share/dict/propernames")
names <- names.all[sample(nrow(names.all), size=N), ]

# ダミーの因子得点を作成 ...データ数は適当に3Nにしました
Y <- matrix(rnorm(2 * 3*N), ncol=2)

このデータに対して、普通にbiplotを使用したものが上記のグラフです。

row.names(X) <- names
biplot(Y, X, xlab="Factor 1", ylab="Factor 2")
grid()

矢印の先に変数のラベルがあるのですが、個人的には矢印の先に“矢印と同じ方向”にラベルが傾いているものが好みです。具体的には以下のようなプロットです。こっちのほうがラベルと矢印の対応が分かりやすいので、理解しやすいのです。

f:id:amarui:20140612194909p:plain

これを描くのに使ったのは以下のコードです。できるだけ文字が上下反転しないように、文字位置が横軸方向で正負のどちらであるかの判定をして、文字の回転方向をかえています。(そのためにatan()で分岐して、text()内のsrt引数で回転角度を指定しています)

plot(X[,1], X[,2], type="n", asp=1, xlim=c(-3, +3), ylim=c(-3, +3), xlab="Factor 1", ylab="Factor 2")
grid()
arrows(0, 0, X[,1], X[,2], length=0.1, angle=15, col="red")
for (n in 1:length(names)) {
  if (X[n,1] >= 0) {
    angle <- atan2(X[n,2], X[n,1]) / pi * 180
    text(X[n,1], X[n,2], labels=names[n], adj=-0.1, col="red", srt=angle)
  } else {
    angle <- atan2(X[n,2], X[n,1]) / pi * 180 + 180
    text(X[n,1], X[n,2], labels=names[n], adj=+1.1, col="red", srt=angle)
  }
}
points(Y[,1], Y[,2], pch=1)