yuu_nkjm blog


2013-02-01(Fri) [長年日記]

[R言語] 統計処理言語Rによるグラフの重ね描き

別サイトに掲載していた記事を再掲載.2008-09-29に書いた様だ.

はじめに

シミュレーションの結果のグラフをひたすら描画させることを目的としてR言語を使ってみました.後輩に作業内容を伝えるために書いている文書を公開.プログラム書いてから,日が経ってしまったので,なかなか思い出せない….

やりたいこと

  1. ./result/id/ディレクトリの下にある,CSVファイルにsimWriterという関数を適用する.
  2. 色分けしたグラフを重ね書きする.

一括処理をする

一括処理のコード全体

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 出来上がりイメージ図

参考ページ


トップ «前の日記(2013-01-24(Thu)) 最新 次の日記(2013-03-10(Sun))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|