ほくそ笑む

R言語と統計解析について

三次元散布図をRで描いてみた

この記事は R Advent Calendar 2011 の8日目の記事です。

はじめに

さて、仕事で三次元散布図を描く必要がでてきました。
R は統計言語として有名ですが、グラフィクスに関しても得意分野です。
R なら三次元散布図も簡単に描けるだろうということで、少し調べてみました。

scatterplot3d

どうやら R には scatterplot3d という三次元散布図を描くためのパッケージがあるようです。
試しにそれを使ってみましょう。
今回はデータとして trees データを使用します。

install.packages("scatterplot3d")
library("scatterplot3d")
data(trees)
scatterplot3d(trees)


簡単に描けました。さすが R。
しかし、これだけでは物足りません。
三次元散布図は角度によって見え方が変わります。
お客様にお渡ししたときに、好きな角度から見ていただけるようにしたいのです。

インタラクティブな三次元散布図

そこで、インタラクティブな三次元散布図は描けないだろうか?と思いました。
なんかこう、マウスでドラッグするとグリグリ動くようなイメージです。
ググってみると、インタラクティブな図を描く R パッケージがたくさん出てきます。
一部を試してみました。

RGLパッケージ

RGL パッケージについてはここ(R-Tips)ここが詳しいです。
これを使って三次元散布図を描いてみましょう。*1

install.packages("rgl")
library("rgl")
plot3d(trees$Girth, trees$Height, trees$Volume)


おお、別ウインドウが開いて三次元散布図が出てきました。
ドラッグするとグリグリと動きます。
良い感じですが、どうやって出力するんでしょうか?
ちょっと調べてみた感じでは PNG でしか出力できそうにありませんでした。
これでは使えません。

playwithパッケージ

次は playwith パッケージです。
GTK+ というのを使ってインタラクティブに R の図を編集できるのだそうです。
早速使ってみましょう。

install.packages("playwith")
library("playwith")
playwith(cloud(Volume ~ Height * Girth, data = trees))


こちらも別ウィンドウが開いて三次元散布図が出てきました。
左側の Pan というのをクリックするとドラッグで図を回転できるようになります(グリグリ動くという感じではないですが)。
これの凄いのは、散布図の一点を選択してラベルを付けたり色を変えたりが簡単にできるというところです。
まさにインタラクティブに図の編集ができます。
でも、やはり出力が静止図でしかできそうにないです。
これは別の用途だったら凄く便利だなー。

googleVisパッケージ

上の二つは出力に問題があったのですが、googleVis パッケージなら JavaScript で動く HTML ファイルを生成してくれます。
実際にやってみましょう。

install.packages("googleVis")
library("googleVis")
scatter <- gvisScatterChart(trees[1:2], 
            options = list(legend = "none", 
                           hAxis = "{title:'Girth'}",
                           vAxis = "{title:'Height'}"))
plot(scatter)


ただまあ、難点は三次元散布図が無いってことなんですけどね。
この出力結果はここに置いておきますので遊んでみてください。
googleVis で出力可能な図のサンプルはここで見ることができます。
モーションチャートはローカルに保存すると動かなくなる(Webサーバ上でないと動かない)など制約はありますが、用途によっては便利だと思います。

まとめ
rgl グリグリ動くが出力として静止図しかできない
playwith インタラクティブに編集しながら静止図を描くには便利そう
googleVis JavaScript ファイルで出力できるが三次元散布図は無い

結局、どれも使えねぇ (´;ω;`)
どうやらインタラクティブにグリグリ動く三次元散布図を作るのは無理そうです。
この方法は諦めて別のアプローチを試してみます。

アニメーションしてみる

三次元散布図をアニメーションで動かしてみましょう。
アニメーションを作るには、animation パッケージを使います。
animation パッケージの使い方については、ここに日本語で丁寧な解説があります。
animation パッケージでアニメーション動画を作成するには ImageMagic をインストールする必要があるみたいですが、今回は HTML 出力機能のみを使うので ImageMagic は必要ありません。

install.packages("animation")
library("animation")
library("scatterplot3d")
ani.start()
for(i in 0:35) {
  scatterplot3d(trees, angle = i*10+5)
}
ani.stop()

出力結果はこれです。
Play ボタンを押すと再生が始まります。
コマ送りのボタンも付いているので、好きなところで止めて観察できます。
HTML 出力なので、お客様の環境によって動かないということもなさそうです。

おわりに

というわけで、最終的にお客様に提出するのは HTML 出力されたアニメーションにしようと思います。
今回いろいろなパッケージを調べてみて、とても勉強になりました。
他にも何かいい感じのパッケージがありましたらご紹介いただければうれしいです。
以上です。

*1:ちょっと変更しました