2009年6月28日日曜日

R で描画しよう

MathematicaがUpdateしてから調子悪い。
描画するとラベルの字がつぶれるつぶれる。25万もするくせになにこれ、うぇーん。
EPSで出力するとフォントつぶれは回避できるんですが、MathematicaのEPSはクソ重くて、それだけで10Mとか論文に貼り付けるにはあまりに激しい容量です…。
そこで、3Dプロットを美しく書けるフリーソフトを探していたわけです。
要求することはただ一つ。離散的な3次元のデータをデータ間の補間を行いつつ3Dプロットすること。
まぁGnuplotでもそれなりのものはかけて、
set pm3d
でpm3dを読み込んでやれば、splotで
http://t16web.lanl.gov/Kawano/gnuplot/plotpm3d.html
ここにあるような3Dのカラーグラフはかけます。しかし、いかんせんGnuplotは3Dデータの補間がないようなのですよ。csplineは基本2次元plot用だし…。
そこで手をだしてみたのが"R"です。
"R"の存在は前々から知っていてその異様にシンプルな名前にびびって手を出せていなかった代物です。統計解析ツールというかそれ専用の言語+統合開発環境です。言語なのでガチでプログラミングぽいです(ToT)
さて、Rの強みの一つはグラフィックが美しいことです。そして統計解析専用に作られているんで、補間用のパッケージとかもごろごろ転がっています。といいことづくめなようなのですが、めっちゃ躓きました。
グラフィックを出力したいのに、デフォルトのグラフィック用の関数が、等間隔のグリッドにしか対応してねぇ…。
私の場合、計算のデータポイントは基本、変動が大きそーなとこは細かく、どーでもよさそうなところは粗く、対数的にとっているのでこれはかなり困りました。
4時間ほど苦闘した結果、
akima(Akima先生?とにかくありがてぇ)っていうライブラリ中にあるinterpという関数を使って補間をつかって等間隔グリッドを作成、データをリストに格納→描画
っていう流れでなんとかなりそうな予感です。
備忘録として、
CSVからデータを取り込み→それをリストに格納→interp→描画
のテストコードをあげておきます。


book1<-read.csv("book1.csv")
library(akima)
rlist<-as.list(NULL)
rlist$x <- c(book1[,1])
rlist$y <- c(book1[,2])
rlist$z <- c(book1[,3])
rlist.li<- interp(rlist$x,rlist$y,rlist$z,
xo=seq(min(rlist$x),max(rlist$x),length=50),
yo=seq(min(rlist$y),max(rlist$y),length=50))
image(rlist.li)
persp(rlist.li)



read.csv():CSVから読み込み
c():リストへの要素の追加や結合
persp():俯瞰図の描画
interp:補間。lengthでメッシュの数を決めることができます

CSVファイルとして

x y z
-5 -5 50
-4 -5 41
-3 -5 34
-2 -5 29
-1 -5 26
0 -5 25
1 -5 26
2 -5 29
3 -5 34
4 -5 41
5 -5 50
-5 -4 41
-4 -4 32
-3 -4 25
-2 -4 20
-1 -4 17
0 -4 16
1 -4 17
2 -4 20
3 -4 25
4 -4 32
5 -4 41
-5 -3 34
-4 -3 25
-3 -3 18
-2 -3 13
-1 -3 10
0 -3 9
1 -3 10
2 -3 13
3 -3 18
4 -3 25
5 -3 34
-5 -2 29
-4 -2 20
-3 -2 13
-2 -2 8
-1 -2 5
0 -2 4
1 -2 5
2 -2 8
3 -2 13
4 -2 20
5 -2 29
-5 -1 26
-4 -1 17
-3 -1 10
-2 -1 5
-1 -1 2
0 -1 1
1 -1 2
2 -1 5
3 -1 10
4 -1 17
5 -1 26
-5 0 25
-4 0 16
-3 0 9
-2 0 4
-1 0 1
0 0 0
1 0 1
2 0 4
3 0 9
4 0 16
5 0 25
-5 1 26
-4 1 17
-3 1 10
-2 1 5
-1 1 2
0 1 1
1 1 2
2 1 5
3 1 10
4 1 17
5 1 26
-5 2 29
-4 2 20
-3 2 13
-2 2 8
-1 2 5
0 2 4
1 2 5
2 2 8
3 2 13
4 2 20
5 2 29
-5 3 34
-4 3 25
-3 3 18
-2 3 13
-1 3 10
0 3 9
1 3 10
2 3 13
3 3 18
4 3 25
5 3 34
-5 4 41
-4 4 32
-3 4 25
-2 4 20
-1 4 17
0 4 16
1 4 17
2 4 20
3 4 25
4 4 32
5 4 41
-5 5 50
-4 5 41
-3 5 34
-2 5 29
-1 5 26
0 5 25
1 5 26
2 5 29
3 5 34
4 5 41
5 5 50

こんなのを用意しとくと


こんなかんじのができます。
これはx^2+y^2を描画してみたものです。

0 コメント: