rgl の plot3d で3Dグラフを描く

困った

眠れん。
仕方ないのでブログ書く←

rgl とは

rgl

rgl: 3D visualization device system (OpenGL)

R上で、OpenGLを使って高度な3Dグラフを描くためのパッケージ。インタラクティブな操作も可能で、3D表示させたものをマウスでぐりぐり回転できる。なかなか良い。

rgl のインストール

インストールは若干やっかいかもしれない。X11のライブラリが見つからないと怒られることがよくあるようだ。オイラもそこで少しハマった。Fedora では以下のコマンドを実行してX11関連のライブラリをインストール。

yum groupinstall "X Software Development"


その後通常通り rgl パッケージをインストールすればOK。

> install.packages('rgl')


rgl を使うには以下のようにライブラリをロードする。

library(rgl)

plot3d

plot3d というコマンドを使って3Dグラフを表示させることができる。


サイズの同じ vector を3つ作ってデータを入れる。

x <- 1:10
y <- seq(1, 19, 2)
z <- c(5, 3, 8, 9, 3, 7, 3, 2, 9, 5)


対応が分かりやすいようにデータフレームに入れてみる。

d <- data.frame(x, y, z)
d
x y z
1 1 1 5
2 2 3 3
3 3 5 8
4 4 7 9
5 5 9 3
6 6 11 7
7 7 13 3
8 8 15 2
9 9 17 9
10 10 19 5


これをプロットする。

plot3d(d$x, d$y, d$z)


デフォルトでは点で描かれる。ちょっと見づらければ球体にすることもできる。色もつけてみよう。

plot3d(d$x, d$y, d$z, type="s", col="green")



type で形状を、col で色を指定可能。またグラフが表示されているウィンドウ上でマウスを操作すると、いろいろな角度から見ることができる。

音声の解析に使ってみる

せっかくなのでもうちょっと実用的なものを表示してみたいと思う。CMajのコードを演奏した音源を用意し、その周波数成分が時間経過でどのように変化するかを見てみる。CMajといっても、ド・ミ・ソ のサイン波を単に合成したものではなく、QY70というシーケンサーで CMajのパターンを数秒間演奏させたものを使う。ドラムやベースなど様々な楽器で構成されているので、いわゆる「雑音」もそれなりに入っている。


プログラムとサンプル音源はここに置いてある。

R --vanilla --slave --args Cmajor.wav < fft3D.R




(画像クリックで拡大)


3Dだとわかりづらいが、result$times(0, 20, 40, 60) が時間(1 = 約0.01秒)、result$freqlist(0, 100, 200, 300) が周波数(Hz)、そして縦軸のresult$amp(0, 5e+06, ...) が音量を表す。4/4拍子なので、時間軸に沿って強い山の間に弱い山が3つほどあるのが何となく分かる。


プログラム内では、result というデータフレームに解析結果を格納し、それを以下で描画している。

plot3d(result$times, result$freqlist, result$amp, col=rainbow(numPreview * 3), type="l", lwd=0.5)

col=rainbow を指定すると色が虹色に変化しながら表示される。すぐ隣のフレームとの変化を見やすくするためにパラメータを微調整した(ので、numPreview * 3 という数値に深い意味はない)。


ところでプログラムの実行が終了するとグラフのウィンドウが消えてしまうので、最後に Sys.sleep(1000)とか入れてみたんだけど、もっといい方法ないですかね。w