カメヲラボ

主にプログラミングとお勉強全般について書いてます

Rプログラミング入門(5)

グラフを描いてみよう(2)

3次元のグラフ

3次元のグラフも簡単に描けるので、紹介しておきます。3次元のグラフを描く関数にpersp(Perspective Plots)というものがあるので、これを使ってみます。手順を簡単に言うと。
(1)x,y平面を格子状に区切る
(2)z座標を求める関数fを定義する。
(3)xy平面の各格子点に対してf(x,y)を求める
(4)persp関数を使ってグラフを描画する
という感じで進めます。

では(1)からはじめます。格子点を作るには、seq関数が便利です。

x <- seq( -10, 10, length=30 )

のようにすると、以下の実行結果の様に-10から10を30等分してくれます。

> x <- seq( -10, 10, length=30 )
> x
 [1] -10.0000000  -9.3103448  -8.6206897  -7.9310345  -7.2413793  -6.5517241
 [7]  -5.8620690  -5.1724138  -4.4827586  -3.7931034  -3.1034483  -2.4137931
[13]  -1.7241379  -1.0344828  -0.3448276   0.3448276   1.0344828   1.7241379
[19]   2.4137931   3.1034483   3.7931034   4.4827586   5.1724138   5.8620690
[25]   6.5517241   7.2413793   7.9310345   8.6206897   9.3103448  10.0000000

y座標についても同じように求めておきます。


次に、z座標を求めるための関数を定義します。とりあえずベタに2次関数にしておきましょう。

f <- function(x,y){r <- -0.1*(x^2+y^2) }

関数が定義できたら、outer関数を用いてz座標を計算します。

z <- outer( x, y, f )

これだけでOKです。ちなみに、単純な演算なら、わざわざ関数を定義しなくても直接文字列を引数に渡してもかまいません。たとえば、x*yを計算するだけなら、

z <- outer( x, y, "*" )

としてやります。


ここまでできたら、あとは描画するだけです。persp関数を使いましょう。

persp( x, y, z, theta=30, phi=30, col="cyan" )

theta,phiはそれぞれ、z軸・x軸回りの回転角度です。30度くらい傾けると綺麗に見えます。colで色を付けてあります。指定しなければ白で描かれます。

最後に、一連の処理をまとめておきます。

x <- seq( -10, 10, length=30 )
y <- seq( -10, 10, length=30 )
f <- function(x,y){r <- -0.1*(x^2+y^2) }
z <- outer( x, y, f )
persp( x, y, z, theta=30, phi=30, col="cyan" )

とっても簡単ですね。

scatterplot3d関数を使ってみる

単純に点をプロットするだけなら、scatterplot3d関数が便利です。

library(scatterplot3d)

を実行して、「そんなの無い」と言われたらダウンロードしましょう。RGuiを使っていれば、メニューからパッケージ→パッケージのダウンロードで簡単にできます。使えることが確認できたら、以下の関数を実行してみてください。

v <- array( runif(300), dim=c(100,3) )
scatterplot3d(v,pch=18)

runif関数は、0〜1の乱数を引き数個だけ生成してくれます。上記の例では300個これを10*3の配列にします。もちろん、x,y,zの3成分に10個ずつという意味ですよ。scatterplot3d関数は、前回解説したplot関数と同じような感じで扱うことができるので、オススメです。