グラフ作成ソフトを探したら、選択肢はR一択だった件

普段はIDLを使用してグラフ作成を行っていますが、IDLが使用できなくなった場合に備えて無償ソフトを探してみました。

考慮する条件は以下のとおりで、英語版wikipediaのplottingカテゴリから探しました。

  • 最近も活発に開発が行われている (最終安定版が最近一年以内にリリースされている)
  • MacPortsで配布されていたり、pkgバイナリが用意されているなど、インストール作業が簡単である。
  • グラフ作成処理をスクリプト化できる

この他、綺麗なグラフの作成やスクリプト言語の習得が容易であるかなども重要だと考えていますが、実際に触ってみなければ判断できないため、選考基準からは外しました。

実際にインストールを試みたのは Fityk, MayaVi, PLplot, QtiPlot, Rでしたが、コンパイルエラーを解決できなかったり、スクリプトの実行に必要なライブラリが見つからないなどの問題が発生しました。結局、自分に使えそうなのは R のみとなりました。

以下に、Rのサンプルとrubyからの利用方法をまとめます。なお、Rのサンプルを実行するには、サンプルのファイル名を sample.r とすると、

$ R --no-save < sample.r

もしくは

$ Rscript sample.r

というコマンドを使用します。

Rスクリプトのサンプルその1

一次元プロット。

x <- c(1,2,3,4,5,6)
y <- x^2
plot(x,y,xlab="x",ylab="y=f(x)",main="f(x) = x^2")

サンプルその2

カラーコントアとコントアの重ねあわせ。ここではpng画像に保存しています。

png(filename="./Rplot.png",width=480,height=480,units="px",bg="white")
x <- (1:100)/100*7
y <- x
r <- sqrt(outer(x*x,y*y,"+"))
z <- sin(r)
n=200
image(x,y,z,col=rainbow(n,s=1,v=1,start=0,end=max(1,n-1)/n,gamma=1,alpha=1))
contour(x,y,z,add=TRUE)

サンプルその3

ファイル入出力。マニュアルを開くとコネクションという単語がでてくるが、ファイル識別子と同じことのようです。
そして、行うべき操作は「開いて、書き込み/読み込み、閉じる」の 3 ステップです。

fn <- file("testdata.bin","wb")
writeBin(1:10,fn)
close(fn)

fn <- file("testdata.bin","rb")
a  <- readBin(fn,integer(), 10)
close(fn)

print(a)

ちなみに、読み込みの際、元データサイズを超過して読み込もうとしても、エラーは出ません。
ファイルの終端まで読み込んだ結果がreadBin()から返ってきます。

サンプルその4

ディレクトリアクセス。以下のサンプルでは、カレントディレクトリにあるファイルから名前が"dat"で終わるものを抽出し、そのファイル名と"dat"を"png"で置き換えた文字列を表示しています。

for (f in  list.files(path=".",pattern="dat$") ) {
  print(f)
  print(sub("dat$","png",f))
}

list.files()でカレントディレクトリにあるファイルのリストを取得できますが、pattern引数に正規表現を与えることで条件に合致したファイルのみ取得することができます。

for()では、list.filesで得られたリストの各要素を f に代入してループ処理が行われています。

sub()には、第一引数に正規表現、第二引数に置換後の文字列、第三引数に置換対象となる文字列を与えます。正規表現にマッチした文字列を全て置換する場合は gsub() を使用します。

RをRubyから利用する

RをRubyから利用できる rsruby があるが、MacPorts版Rではインストールがうまくできません。このため rsruby を使用する場合は、R本家で配布されているパッケージをインストールします。設定内容などについては、以下のサイトが参考になります。

http://d.hatena.ne.jp/hrsth/20100204/1265288817

サンプルは、

require 'rubygems'
require 'rsruby'
r = RSRuby.instance
x = (1..10).map {|i| i}
y = x.map {|i| i*i}
r.plot(x,y,{:xlab=>"x",:ylab=>"y"})

xlabなどのキーワード引数はハッシュとして渡します。

rsrubyでもpngなどの画像へ出力したいところですが、r.png()を実行してもファイルが生成されません。この時エラー出力もないため、なぜ画像ファイルが生成されないのか分かっていません。

コメント

このブログの人気の投稿

git-svnでFILE was not found in commit HASH

神スクリプトの使い方 Codeforces編

JavaでIRCクライアント