3次元空間の曲面の描画

R

Z座標を行列で与える場合

3次元の曲面は、2次元平面上の点(x, y)と、その点でのZ座標の値zを与え、隣接する座標を直線で結ぶことで、得られた3角形を、光源との角度に応じた色の明暗を反映させて描いていくことで、描画できる。(下図はWikipediaのポリゴンメッシュの図をお借りした)

ただし、関数$z=f(x, y)$の表示には、3角形のポリゴンを描画していく必要はない。通常は、X-Y平面上の格子点上の関数の値Zを得て、四角形を作って表示すれば十分である。むしろこの方が、計算点を明示できていい。

基本は関数persp。

z = matrix(c(0,0,0,
0,1,2,
0,2,4,
0,3,8,
0,4,16), ncol=3, byrow=TRUE)
x = c(0, 1, 2, 3, 4)
y = c(0, 1, 2)
persp(x, y, z)

上の関数を実行すると、次のグラフが描画される。

zには計算点上の値を行列として与えている。xとyには、軸方向の計算点のベクトルを与えている。この三つを関数perspに与えると、上のグラフを得る。

これに少し工夫を加えて、色を指定できる。

z.colors = colorRampPalette(c("blue", "yellow"))
z.color = z.colors(100)
zfacet = z[-1, -1] + z[-1, -3] + z[-5, -1] + z[-5, -3]
facetcol = cut(zfacet, 100)
persp(x, y, z, col = z.color[facetcol])

z.colorsは、青と黄色の中間色でz軸方向の値を表現することを宣言している。z.colorは具体的に、青と黄色を100分割して色を定めている。配列zfacetは、説明するよりむしろ中身を見てもらう方がいい。これは、それぞれの4点で定まる格子上の四角形の頂点のzの値の平均を与えている。配列facetcolは、z軸の値を100分割している。こうすると最後に、z.color[facetcol]は各ポリゴンの中央の値に最も近い100分割に対応する色を返す。

上のコードを実行すると、次のグラフが描画される。

同様のグラフは、GAパッケージの中の関数persp3Dを用いると、細かい設定なしに似たようなグラフを生成してもらえる。

install.packages("GA")
library(GA)
persp3D(x, y, z)

上のコードを実行すると、次のグラフが描画される。

細かいカスタマイズが可能な関数perspと、カスタマイズなしに少し見栄えのいい画像を生成してくれる関数persp3Dを、必要に応じて使い分けるといい。