yuu_nkjm blog
2013-02-01(Fri) [長年日記] 編集
[R言語] 統計処理言語Rによるグラフの重ね描き
別サイトに掲載していた記事を再掲載.2008-09-29に書いた様だ.
はじめに
シミュレーションの結果のグラフをひたすら描画させることを目的としてR言語を使ってみました.後輩に作業内容を伝えるために書いている文書を公開.プログラム書いてから,日が経ってしまったので,なかなか思い出せない….
やりたいこと
- ./result/id/ディレクトリの下にある,CSVファイルにsimWriterという関数を適用する.
- 色分けしたグラフを重ね書きする.
一括処理をする
一括処理のコード全体
resultDir = "./result/" ids <- list.files(resultDir); <strong>#(1)</strong> for (id in ids) { <strong>#(2)</strong> directoryName <- paste(resultDir, id, "/csv", sep=""); <strong>#(3)</strong> files <- list.files(directoryName, pattern=".csv"); <strong>#(4)</strong> for(file in files){ fileBase <- sub('(.*).[^.]*', "1", file); <strong>#(5)</strong> try(simWriter(resultDir, id, fileBase)); <strong>#(6)</strong> } }
(1) result以下のディレクトリ階層は以下のようになっている.idsにA01,A02,A03が入る.
./result/ │ ├─ A01 ─csv─┬──000.csv ├─ A02 ├──001.csv ├─ A03 ├──002.csv
(2) シェルスクリプトチックなループ.
(3) paste関数は与えられた文字列を結合する関数.sepの値が結合部に挿入される.空にしたい時は""と書く.
(4) list.file関数により,対象ディレクトリ以下のpatternにマッチするファイル名を取り出す.
(5) 正規表現を使った文字列操作.sub関数により拡張子を取り除いた文字列を生成.
(6) try関数を用いることで,エラーがあっても停止せずに継続できる.
グラフの重ね描き
simWriter <- (resultDir, id, fileBase) dataFileName <- paste("resultDir", "hoge", sep="") orgDataFileName <- paste("resultDir", "fuga", sep="") resultTable<- read.table (dataFileName, header = T, sep="t", skip=2); <strong>#(1)</strong> subjectTable<- read.table (orgDataFileName, header=T, sep="t"); drawSimResult(resultTable); drawOrgData(subjectTable); dev.off(); }
(1) データの読み込み.セパレータはタブ.dataFileNameの先頭2行には人間が識別する用のデータが入っているのでスキップ.
drawSimResult <- function(resultTable){ plot(resultTable$kilo, resultTable$speed, type ="p", pch=15, col="blue", ylim=c(5,135), xlim=c(0.7,10.3), xlab = "", ylab = ""); #(1) }
(1) 散布図を書く.x軸がresultTableのkilo列,y軸がresultTableのspeed列.線は引かず点だけ.点の形は■(15番),色は青(16進数のカラーコードでもいける),x軸の描画範囲は0.7~10.3,Y軸の描画範囲は,5~135.x軸ラベル,y軸ラベルは無し.
drawOrgData <- function(subjectTable){ par(new = T); <strong>#(1)</strong> plot(subjectTable$KILO, subjectTable$SPEED, type ="p", pch=15, col="#FFE4B5", ylim=c(5,135), xlim=c(0.7,10.3), xlab = "", ylab = ""); }
(1) グラフの上書きをするコマンド(par(new = T)).
データファイルの中身
dataFileNameの中身はこんな感じ.
人間が読み取る データが二行 kilotspeed 1t100 2t110
orgDatFileNameの中身はこんな感じ.
KILOtSPEED 1t100 2t110
もう少し色々やった出来上がり図
Fig. 1 出来上がりイメージ図