三次元散布図

R の三次元散布図を描く関数としては、plot3dscatterplot3d などがある。plot3d は OpenGL を利用して立体図を描く。描いた立体図は回転したり、拡大縮小したりすることができる。scatterplot3d は描画角度を指定して、静止画を描く。

plot3d

plot3d 関数は rgl パッケージに含まれている。これを利用するために rgl をインストールする必要がある。

install.packages("rgl", dependencies = TRUE)

立体図を描くとき、3 次元の座標を plot3d を与える必要があり、その与え方は 2 通りある。

  1. z 座標を行列型で与える
  2. x、y、z 座標をそれぞれ独立に与える

z 座標を行列型として与える方法

z 座標を行列型として与える方法。このとき行列の行と列に対応する x 座標と y 座標も併せて与える。すなわち、z 座標は行列型で、x 座標と y 座標はベクトル型になる。

library(rgl)

# z 座標
z <- matrix(1:20, ncol = 4, nrow = 5)
z
##      [,1] [,2] [,3] [,4]
## [1,]    1    6   11   16
## [2,]    2    7   12   17
## [3,]    3    8   13   18
## [4,]    4    9   14   19
## [5,]    5   10   15   20

# x 座標と y 座標を設定
x <- c(1, 2, 3, 4)       # z 行列の各行の座標
y <- c(1, 2, 3, 4, 5)    # z 行列の各列の座標

plot3d(x, y, z)


# PNG 形式で保存
rgl.snapshot("plot3dimage.png")
 
# postscript 形式で保存
rgl.postscript("plot3dimage.ps")

plot3d を実行すると立体図が描かれる。この立体図はマウスで回転させたりすることができる。

x、y、z 座標をそれぞれ独立に与える方法

x 座標、y 座標と z 座標をそれぞれ独立にベクトルとして与えて立体図を描く例。

x <- rnorm(100, 2, 10)
y <- rnorm(100, 4, 10)
z <- rnorm(100, 6, 10)

plot3d(x, y, z)

rglパッケージをインストールする時に発生するエラー

Ubuntu で rgl パッケージをインストールするとき、X11 に関するエラーが起こる場合がある。

configure: error: X11 not found but required, configure aborted.
ERROR: configuration failed for package ‘rgl’
configure: error: missing required header GL/gl.h
ERROR: configuration failed for package ‘rgl’

mesa 関連のライブラリーを Ubuntu にインストールするとエラーがなくなる。apt-get でインストールするとき、パッケージの依存が壊れているとかのエラーが出るようであれば、apt-getaptitude に書き換えてインストールするとうまく行く場合がある。

sudo apt-get install libgl1-mesa-dev
sudo apt-get install libgl1-mesa-swx11
sudo apt-get install libegl1-mesa
sudo apt-get install libegl1-mesa-*
sudo apt-get install libglu1-mesa
sudo apt-get install libglu1-*
sudo apt-get install libgles1
sudo apt-get install libopenvg1-mesa
sudo apt-get install libglu1-mesa-dev

scatterplot3d()

scatterplot3d は scatterplot3d パッケージに含まれている。利用するには該当パッケージをインストールする必要がある。

install.packages("rgl", dependencies = TRUE)

座標は x、y、z 座標をそれぞれ独立にベクトルとして与える。

library(scatterplot3d)

x <- c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
y <- c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
z <- c(1, 6,11,16, 2, 7,12,17, 3, 8,13,18, 4, 9,14,19, 5,10,15,20)

scatterplot3d(x, y, z)
scatterplot3d関数によって描かれた三次元散布図です