Rってめっちゃ検索しにくくね!?
タイトルはただの愚痴です。
情報検索能力が著しく低い身としては、もう少し名前、どうにかならなかったんですかと2、3分ほど問い詰めたい思いではありますが、まあそれもいいでしょう。
どうでもいいことです(主にこの文章が)。
さて。
タイトルの通り、今回はRのplotに関する個人メモですね。
グラフを書く際などに、gnuplotを用いるという手法が偉い人たちの間ではメジャーなんでしょうが、僕のような怠惰なライトユーザーには、彼は敷居が高い感じです。
ライトと怠惰、どちらが原因なのかという疑問を感じた人は、お疲れ気味のようなのでお体を大切に。
で、特に今回はRscriptを用いた例をメモります。
使用イメージ:
まずは、どういう使い方がしたかったかというお話から。
まず、下記のようなデータファイルがあったとしましょう。
5.049930979133517 6.736440649585864 6.8435364429119945 9.879380973488646 ......
これをグラフにして表示したい場合。
今回は、まあ折れ線グラフを想定しましょう。出力形式はEPSですよ。
Why you use Rscript?:
Rscriptはコマンド名です。
Ubuntu、ならびにFreeBSD環境においてはRをインストールすればお目にかかれると思います。
名前から連想される通り、これによってRのスクリプトを実行できます。
では、なぜスクリプトなんかが必要なのかと言うと、
- フォーマットは同じなんだけど、データが何種類かあって、それぞれ自動処理したい。
- データの生成から、グラフのプロットまでを自動化したい。
など、つまり単純な処理フローを自動化したいという思いからです。
まあ、この辺シェルスクリプトと同じですよね。
そんな訳で。
Rscriptで実行するスクリプトファイルの例を次に挙げます。
スクリプト:
さっきのデータを単純にグラフとしてEPS形式で吐き出させるなら、という体でお送りします。
データファイルがdata.datというファイルで保存されているとお考えください。
まずは、スクリプトから。
args <- commandArgs() (x <- scan(args[6])) x11() plot(x,xlim=c(400,700),ylim=c(0,30),type="l",ann=F,axes=FALSE) dev.copy(device=x11,width=10,height=5) dev.copy2eps(file=args[7]) dev.off(dev.prev()) dev.off()
名前は……data-plot.Rとでもしておけばいいんじゃないかと思ってます。拡張子なんて、対した問題ではないですので(少なくとも、ここにおいては)。
次に、実行方法。スクリプト名"data-plot.R"、データファイル"data.dat"、出力ファイル名"result.eps"とします。
% Rscript data-plot.R data.dat result.eps
シェル上でこのように実行しますと、まあresult.epsが出力されるというスクリプトです。
さて、Rの記法や関数のきめ細やかな説明は割愛します。それらをまとめて下さっている、僕なんかより優秀な方々が世の中には星の数ほど、人の数だけいらっしゃるのです。(つまり……)
そういうことですから、ここでは概要だけを列記しときます。
- commandArgs()で実行時引数を格納します。
- scan(args[6])でデータファイルからデータを読み取っていますが、なぜ6かは4とか5とかをご自分で試して頂けたら自明です。結論から言うと、args[6]はdata.datという文字列が格納されています。
- EPSに出力する肝となるのが、x11()やdev.*の辺りです。出力そのものは、dev.copy2epsで行っています。この辺も、詳しくは触れません。それやってると疲れます。
- dev.offは……まあ、開いたら閉じるんです。最後はそういうことです。
まあ、動かして頂ければ、それとなく雰囲気はつかめるかと思います。
メモとして重要なのは、形であって細部ではないので。
応用(グラフの重ね合わせ):
最後に、グラフを重ね合わせる場合の例を載せておきます。これについては、一切の説明を割愛します。
ま、馬鹿が知った口を聞くより万倍マシでしょう。
args <- commandArgs() (x <- scan(args[6])) (y <- scan(args[7])) x11() plot(x,ylim=c(0,1e-1),type="l",ann=F,axes=FALSE,lty=2) par(new=T) plot(y,ylim=c(0,1e-1),type="l",ann=F) dev.copy(device=x11,width=10,height=5) dev.copy2eps(file=args[8]) dev.off(dev.prev()) dev.off()
実行方法。
Rscript freq-plot.R male-x1.dat female-x1.dat x1.eps
みたいな?