こにしき(言葉・日本社会・教育)

関西学院大学(2016.04~)の寺沢拓敬のブログです(専門:言語社会学)。

対応分析 ca() の出力を maptools() で自動的に描画するR関数(カテゴリ数が多い集計表向け)

対応分析 ca() の出力をデフォルトで出力しようとすると,カテゴリ数が多い集計表だと字が重なって何がなんだかわからなくなります。

# Rデフォの swiss データを使った描画
res.ca <- ca::ca(swiss)
plot(res.ca)

これを解決するためにmaptools()が便利です。 ただし,ca 出力はそのままは入らないので,多少工夫が必要です。 そこで,そのまま放り込めばそれっぽい描画になる関数を作りました。

関数

なお,以下の関数は,{maptools} のインストールが前提です。

install.packages("maptools")
ca2maptools <- function(ca.res,   CEXR = 1  ,CEXC = 3 , CEX = .7){

#座標情報抽出
xr <- summary(ca.res)$row[,c(" k=1"," k=2")]
 rownames(xr) <- ca.res$rownames
xc <- summary(ca.res)$columns[,c(" k=1"," k=2")]
 rownames(xc) <- ca.res$colnames
xrc <- 0.001*rbind(xr,xc)

# 図示 # library(maptools)
XLIM = c( min(xrc[,1]) - abs(0.1*min(xrc[,1]))   ,  max(xrc[,1]) + abs(0.1*max(xrc[,1])) )
YLIM = c( min(xrc[,2]) - abs(0.1*min(xrc[,2]))   ,  max(xrc[,2]) + abs(0.1*max(xrc[,2])) )
LOAD <- format(summary(ca.res)$scree[1:2,"values2"],digit=3)
XLAB <- paste("Dimension 1 (", LOAD[1], "%)",sep="")
YLAB <- paste("Dimension 2 (", LOAD[2], "%)",sep="")

plot(0,0,type="n",xlim = XLIM,  ylim = YLIM,  xlab=XLAB ,ylab=YLAB)
points(xrc
       ,cex=c( rep(CEXR, nrow(xr) )     , rep(CEXC, nrow(xc)) )
       ,pch=c( rep(17,nrow(xr))         , rep(16, nrow(xc)) ) 
       ,col=c( rep( "orange3",nrow(xr)) , rep( "lightcyan2" , nrow(xc)   ) ) )
maptools::pointLabel(xrc,rownames(xrc),cex=CEX)
}

冒頭と同様のデータを使った描画例

res.ca <- ca::ca(swiss)
ca2maptools(res.ca)