1

x 軸に 2 つの異なる時間スケールを示すプロットを作成しようとしています。問題は、2 つの時間スケールが複雑な関係にあることです。

気象データを日別および熱量単位で表示したいと思います。熱量単位は、毎日の平均気温の累積です。熱量ユニットを大量に取得する日もあれば、それほど多くない日もあります。年間通算日と熱単位の関係にスプラインを当てはめ、それを使用して各日の熱単位の値を予測しました。だから私は次のヘッダーを持つ素晴らしいデータセットを持っています:年の日(日)、熱単位(gdd)、温度(temp)、降水量(precip)。

次の図を作成しました (新しいウィンドウで開く必要がある場合があります)。間違った縮尺

このコードで:

pdf(file="Climate 2010.pdf", family="Times")
par(mar = c(5,4,4,4) + 0.3)

plot(cobs10$day, cobs10$precip, col="white", type="h", yaxt="n", xaxt="n", ylab="",      
xlab="")
axis(side=3, col="black", labels=FALSE) 
at = axTicks(3)
mtext(side = 3, text = at, at = at, col="black", line = 1, las=0)
mtext("Day of Year", side=3, las=0, line = 3)

par(new=TRUE)
plot(cobs10$gdd, cobs10$temp, type="l", col="red", yaxt="n", ylab="", xlab="Thermal    
Units")
axis(side=2, col='red', labels=FALSE)
at= axTicks(2)
mtext(side=2, text= at, at = at, col = "red", line = 1, las=0)
mtext("Temperature (C)", side=2, las=0, line=3)

par(new=TRUE)
plot(cobs10$gdd, cobs10$precip, type="h", col="blue", yaxt="n", xaxt="n", ylab="",   
xlab="")
axis(side=4, col='blue', labels=FALSE)
at = axTicks(4)
mtext(side = 4, text = at, at = at, col = "blue", line = 1,las=0)
mtext("Precipitation (cm)", side=4, las=0, line = 3)

dev.off()

これはまさに私が望んでいることですが、ここでは x 軸のスケールが線形であり、そうであってはならないことに気付きました。降水データを白にして上書きすることで、上の x 軸を入れました。緑色にするとどうなるか見てみましょう:

明らかにスケールがおかしい

物事が一致しないことは明らかです。 では、どうすれば 2 つの軸を互いにスケールさせることができるでしょうか?

これは、予測によって時間単位が一致する場所で使用している小さなデータフレームです: cobs10.txt。「gdd」は熱単位です

編集: par(new=TRUE) を使用しない新しいコードを次に示します。

par(mar = c(5,4,4,4) + 0.3)
plot(cobs10$gdd, cobs10$temp, type="l", col="red", yaxt="n", xlab="", ylab="",     
ylim=c(-25, 30))
lines(cobs10$gdd, cobs10$precip, type="h", col="blue", yaxt="n", xlab="", ylab="")

axis(side=3, col="black", at=cobs10$gdd, labels=cobs10$day) 
want<-(c(1, 130, 150, 170, 190, 210, 230, 250, 270, 360))
mtext(side = 3, text = want, at = want, col="black", line = 1, las=0)
mtext("Day of Year", side=3, las=0, line = 3)

axis(side=2, col='red', labels=FALSE)
at= axTicks(2)
mtext(side=2, text= at, at = at, col = "red", line = 1, las=0)
mtext("Temperature (C)", side=2, las=0, line=3)

axis(side=4, col='blue', labels=FALSE)
at = axTicks(4)
mtext(side = 4, text = at, at = at, col = "blue", line = 1,las=0)
mtext("Precipitation (cm)", side=4, las=0, line = 3)
4

1 に答える 1

0

を使用することはほとんど良い考えではありませんpar(new=TRUE)。解決するよりも多くの問題を引き起こします。

使用する x 軸の単位 (日単位または熱量単位) を決定し、その単位を使用して最初のグラフを作成してから、 または のような関数をpoints使用linesして、既存の単位を使用して既存のグラフに点または線を追加します。次に、axis関数を使用して別の軸を追加し、at引数に元の単位を使用しますが、ラベルの他の単位への変換を使用できます (目盛りの位置を元の単位に一致させるかどうかを決定する必要があります。変換された単位の適切な値を与える場所にあること)。

于 2013-03-29T20:59:22.213 に答える