プログラミングの備忘録

プログラムをつくる過程を残すもの

Rの備忘録 -3次元グラフ-

f:id:taq2777:20220201230703p:plain こんにちは。
今回は、3次元のグラフをRで描くということをやってみます。

以前に3次元のグラフはRの方が描きやすいかもしれないという話をしましたが、実際にやってみてどれくらい違うのか見てみます。


パッケージのインストール

3次元でグラフを描くにあたって、Rには専用のパッケージがあるのでまずはそれを導入します。
(この時点で楽だということがわかりますが。)
Consoleで

instal.packages("rgl")

と打てば、パッケージのインストールが始まります。

コード中で読み込む際には、

library(rgl)

と打てばOKです。


3次元でグラフを描く

まずは描きたい関数を決めます。
今回はprocessingとの比較が目的なので、

taq.hatenadiary.jp

にならって万有引力の式をグラフ化します。

では、関数を定義してみます。

G <- 100
M <- 100
m <- 1
f <- function(x, y){-G*M*m/sqrt(x^2+y^2)}

これだけです。
G、M、mそれぞれの値を決めて、関数名をfとしてfunction()で関数を指定します。
rはある点(mのある場所)から中心(Mのある場所)までの距離ですが、三平方の定理からxとyを使って計算できます。今回は原点 (0, 0) を中心としています。


続いて、グラフ化するためにx、y、zの値を計算します。

x <- seq(-1, 1, length=50)
y <- seq(-1, 1, length=50)
z <- outer(x, y, f)

x、yは-1~1までを50等分した数列としています。
Consoleに「x」または「y」と打てば中身を見ることができますが、

-1.00000000, -0.95918367, -0.91836735, -0.87755102, -0.83673469, -0.79591837, ...

というように50個の数字が並んでいます。

zはouter()を使って計算をしています。
outer(x, y, f)では、様々なxとyの組み合わせについて関数fにあてはめて計算をする処理になっています。

簡略化して例を示せば、x = y = (1, 2, 3) でf = xyのとき、outer(x, y, f)は

x\y [1]   [2]   [3]
[1]  1     2     3
[2]  2     4     6
[3]  3     6     9

のような値になります。


最後に、グラフ化します。

persp3d(x, y, z, col="lightblue", lit=F)
persp3d(x, y, z, front="lines", back="lines", lit=F, add=T)

persp3d()を使いたいためにライブラリrglを読み込んだわけですが、1つ目のpersp3d()はグラフの面を描画するためのもので、2つ目のpersp3d()はグラフにグリッド線を入れるためのものです。

引数については、colで色の指定、litで光の反射の有無の指定をしています。
frontとbackはグラフ面の表と裏のことで、"lines"で実線を引くように指定しています。
addは図を書き加えるか否かを指定し、2つ目のpersp3d()にadd=Tが無いと、1つ目のpersp3d()が上書きされて消えてしまいます。


以上をまとめると、

library(rgl)

G <- 100
M <- 100
m <- 1
f <- function(x, y){-G*M*m/sqrt(x^2+y^2)}

x <- seq(-1, 1, length=50)
y <- seq(-1, 1, length=50)
z <- outer(x, y, f)

persp3d(x, y, z, col="lightblue", lit=F)
persp3d(x, y, z, front="lines", back="lines", lit=F, add=T)

実行してみると、

f:id:taq2777:20220201225607p:plain

このようにグラフが描かれます。
しかもグリグリ動かせるので、いろんな角度から見ることもできます。


ここまでで、Rで3次元のグラフを描く方法について書いてみました。
processingで書いた場合と比べるとかなり楽になっていますが、ライブラリを使ったおかげと言って良いでしょう。
processingの場合でももっと良くすれば簡単に描けるようにできると思いますが、それは気が向いたらやってみたいと思います。

このようなライブラリがすでにあるということはその需要があるということで、データのグラフ化、すなわち統計に特化した言語であると言うことができるのだと思います。


今回はここまでです。また次回。