Rで半透明の散布図を描く

大量のデータに対して散布図を描く場合、半透明な点をプロットすると、なんとなくカッコよく見えます。それだけと言えば、それだけですが。




↑普通の散布図




↑半透明化(アルファブレンド)




↑半透明化(アルファブレンド、縁なし)


コードはこんな感じ。適当な乱数データをk-means法で3群にクラスタリングして、赤・青・緑の3色に色づけします。

# 300データ、3変数からなる標準正規乱数
x <- matrix(rnorm(900), 300, 3)

# z変換して主成分分析 (3変数を2成分に要約するのに利用)
pr <- prcomp(scale(x))

# k-means法で3クラスタに分離
cl <- kmeans(x, 3)$cl

# プロット用データ
x11 <- pr$x[cl==1,1]
x12 <- pr$x[cl==1,2]
x21 <- pr$x[cl==2,1]
x22 <- pr$x[cl==2,2]
x31 <- pr$x[cl==3,1]
x32 <- pr$x[cl==3,2]

# 描画前に確認
p <- par(ask=TRUE)

# 普通のプロット
plot(pr$x, ty="n") # 軸のみ
points(x11, x12, col=rgb(1, 0, 0), pch=19, cex=2)
points(x21, x22, col=rgb(0, 1, 0), pch=19, cex=2)
points(x31, x32, col=rgb(0, 0, 1), pch=19, cex=2)

# 半透明プロット(縁あり)
plot(pr$x, ty="n") # 軸のみ
points(x11, x12, col=rgb(1, 0, 0, alpha=0.1), pch=19, cex=2)
points(x21, x22, col=rgb(0, 1, 0, alpha=0.1), pch=19, cex=2)
points(x31, x32, col=rgb(0, 0, 1, alpha=0.1), pch=19, cex=2)

# 半透明プロット(縁なし)
# この場合、col=NULLとしてpch=21とする
plot(pr$x, ty="n")
points(x11, x12, col=NULL, bg=rgb(1, 0, 0, alpha=0.1), pch=21, cex=2)
points(x21, x22, col=NULL, bg=rgb(0, 1, 0, alpha=0.1), pch=21, cex=2)
points(x31, x32, col=NULL, bg=rgb(0, 0, 1, alpha=0.1), pch=21, cex=2)

# 描画パラメータの復元
par(p)

ここでのポイントは、points()内のcolパラメータで指定している部分です。rgb関数を用いると、rgb(red, green, blue)などとすることで、光の3原色に基づいた色を作成することができます。ここで、デフォルトではred / green / blueともに0以上1以下となります(値の指定範囲はmaxColorValueオプションで変更できます)。例えば、rgb(1, 0, 0)とすれば赤、rgb(0, 0, 1)であれば青となります。
さらにalphaオプションを設定することで、透過率を設定することができます。ここではalpha=0.1としていますので背景の白地が透けており、白っぽいプロットに見えます。また、重なった部分は確かに色が濃くなっています。
また、各点の縁をなくすには、col=NULLとしてbgに色を指定し、pch=21とします。