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とします。