| Top Page | プログラミング | R 自動化 目次 | 8章へ |

#  渡された温度データのベクトルを,最初からひとつづつ積算して積算温度のベクトル
#  を作製する関数.積算温度を計算するときの基準温度 threshold はディフォルトでは
#  5 度となる.

calc.deg.day <- function(t.data, threshold = 5) 
{
    x <- t.data[1] - threshold  #  1 日めの積算温度
    if (x < 0) {
        x <- 0
    }

    deg.day = c(x)  #  要素がひとつのベクトル

    for (i in 2:length(t.data)) {     #  2日めからの温度
        if (t.data[i] > threshold) {  #  基準温度より高ければ…
            x <-  (t.data[i] - threshold) + deg.day[i - 1]  # 前日までの積算温度に加える.
        }
        else {
            x <- deg.day[i - 1]        #  そうでなければ,積算温度は前日の値のまま.
        }
        deg.day <- c(deg.day, x)     #  積算温度のベクトルの後尾に x を付け加える.
    }

    return (deg.day)     #  t.data の最後まで行ったあと,できたベクトルを返す.
}


########################################################
# calc.deg.day を使って積算温度を計算し,グラフを描く

t <- read.table ('temperature.txt', header = TRUE)  # データの読み込み

n.sites <- ncol(t) - 1    # 測定地点数

for (i in 1:n.sites) {              # 各地点について…
    calc.deg.day(t[[i + 1]]) -> dd  #  積算温度を計算する(温度データは2列目から)
    t <- cbind(t, dd)               #  データフレーム t に列を加える.
    colnames(t)[ncol(t)] <- sprintf("DegDay%02d", i)  #  列に名前をつける.
}

# グラフの座標系だけつくる.
plot(0, 0, type = 'n',              #  type = 'n' なので,渡すデータはなんでもよい.
     xlim = range(t[1]),                        #  横軸の範囲
     ylim = range(t[(n.sites + 2):ncol(t)]),    #  縦軸の範囲
     xlab = 'Day', ylab = 'Degree Day')

for (i in (n.sites + 2):ncol(t)) {     #  2列めから最後の列まで
    lines(t[[1]], t[[i]], col = i - n.sites - 1)  #  日付を横軸に,温度を縦軸に線グラフ
}

#  ↑ 上で, (n.sites + 2):ncol(t) としていることに注意.
#  最初のカッコをなしに n.sites + 2:ncol(t) とすると,
#  2:ncol(t) で作られるすべての要素に n.sites が足されたベクトルになる.

par(usr = c(0, 1, 0, 1))    # 凡例が書きやすいように座標系を設定する.

# 色の設定は lines での設定と対応させることに注意.
legend(0.1, 0.9, colnames(t[(n.sites + 2):ncol(t)]), col = 1:n.sites, lty = 1)

| Top Page | プログラミング | R 自動化 目次 | 8章へ |