R - построить 2 линии тренда на одном графике и изменить длину линии

У меня есть набор данных с фактическими и смоделированными значениями. Я разделил набор данных на два периода с января 2003 г. по декабрь 2006 г. и с января 2007 г. по декабрь 2012 г. и начертил линии тренда — есть две линии тренда для фактических значений (для 2 периодов времени) и 2 для смоделированных. Я приложил картинку - я хочу контролировать длину строк, чтобы они начинались и заканчивались в нужное время - но я не могу этого понять! Я приложил код, с которым мне удалось справиться до сих пор - я все еще довольно новичок. Также прикрепил изображение на случай, если вышеизложенное не ясно. Спасибо!

Я не уверен, есть ли способ поставить вертикальную линию на 2007 год (январь) и использовать эту линию в качестве ссылки для начала и остановки соответствующих строк?

plot(NULL, type="n", xlim=x.limit, ylim=c(-30, 30), xlab="Year", ylab="Equivalent Water     Depth (cm)", axes=F, cex.lab=0.9)

box(lwd=1.5)
abline(h=0, col="gray50", lty=1, lwd=1)
axis(1, seq(2003, 2013, 1), cex.axis=0.7)
axis(2, seq(-40, 40, 10), las=1, cex.axis=0.7, tck=-0.03)
minor.tick(nx=4, ny=0, tick.ratio=0.5)
lines(tws.avg.VNB[,2] ~ tws.avg.VNB[,1], type="l", lwd=2, col=1) 

tws.slope1 <- round(as.vector(coef(lm(SPLIT.1.ALL.VNB[,2] ~ SPLIT.1.ALL.VNB[,1]))[2]), 2)
tws.sdev1 <- round(as.vector(coef(summary(lm(SPLIT.1.ALL.VNB[,2] ~ SPLIT.1.ALL.VNB[,1])))[, "Std. Error"][2]), 2)
mtext(paste("GRACE Trend: 2003-2007 (cm/yr): ", tws.slope1, "±", tws.sdev1, sep=""), cex=0.5, side=1, line=-1.8, adj=0.15)
abline(lm(SPLIT.1.ALL.VNB[,2] ~ SPLIT.1.ALL.VNB[,1]), lwd=2, lty=2, col="deepskyblue")

tws.slope2 <- round(as.vector(coef(lm(SPLIT.2.ALL.VNB[,2] ~ SPLIT.2.ALL.VNB[,1]))[2]), 2)
tws.sdev2 <- round(as.vector(coef(summary(lm(SPLIT.2.ALL.VNB[,2] ~ SPLIT.2.ALL.VNB[,1])))[, "Std. Error"][2]), 2)
mtext(paste("GRACE Trend: 2007-2012 (cm/yr): ", tws.slope2, "±", tws.sdev2, sep=""), cex=0.5, side=1, line=-1.1, adj=0.15)
abline(lm(SPLIT.2.ALL.VNB[,2] ~ SPLIT.2.ALL.VNB[,1]), lwd=2, lty=2, col="deepskyblue")
lines(VNB.OBS.TWS[,1] ~ tws.avg.VNB[,1], type="l", lwd=2, col="red")

tws.slope3 <- round(as.vector(coef(lm(SPLIT.1.ALL.VNB[,6] ~ SPLIT.1.ALL.VNB[,1]))[2]), 2)
tws.sdev3 <- round(as.vector(coef(summary(lm(SPLIT.1.ALL.VNB[,6] ~ SPLIT.1.ALL.VNB[,1])))[, "Std. Error"][2]), 2)
mtext(paste("OBSERVED Trend: 2003-2007 (cm/yr): ", tws.slope3, "±", tws.sdev3, sep=""), cex=0.5, side=1, line=-1.8, adj=0.85)
abline(lm(SPLIT.1.ALL.VNB[,6] ~ SPLIT.1.ALL.VNB[,1]), lwd=2, lty=2, col="forestgreen")

tws.slope4 <- round(as.vector(coef(lm(SPLIT.2.ALL.VNB[,6] ~ SPLIT.2.ALL.VNB[,1]))[2]), 2)
tws.sdev4 <- round(as.vector(coef(summary(lm(SPLIT.2.ALL.VNB[,6] ~ SPLIT.2.ALL.VNB[,1])))[, "Std. Error"][2]), 2)
mtext(paste("OBSERVED Trend: 2007-2012 (cm/yr): ", tws.slope4, "±", tws.sdev4, sep=""), cex=0.5, side=1, line=-1.1, adj=0.85)
abline(lm(SPLIT.2.ALL.VNB[,6] ~ SPLIT.2.ALL.VNB[,1]), lwd=2, lty=2, col="forestgreen")

legend("bottomright", "(a)", bty="n", cex=0.8) 
legend("top", legend=expression(Delta~TWS~(GRACE), GRACE~TREND, Delta~TWS~(OBSERVED), OBSERVED~TREND),
   lty=c(1,4,1,4), lwd=c(2,2,2,2), col=c(1,"deepskyblue","red","forestgreen"),
   bty="n", horiz=T, cex=0.6)

Код для верхнего графика!


person Darren J    schedule 23.08.2014    source источник


Ответы (1)


Загляните в пакет zoo. Среди многих других функций он реализует новый класс специально для временных рядов, который отслеживает временную базу, и метод plot.zoo использует его. В качестве очень, очень минимального примера вы можете попробовать что-то вроде следующего:

a <- zoo(rnorm(5), 1:5)
b <- zoo(rpois(5, 1), 1:5)
plot(cbind(a, b))

Базовое решение R также довольно простое:

a <- rnorm(5)
b <- rpois(5, 1)
plot(a ~ 1:5, xlim = c(0, 10))
points(b ~ 6:10)
person shadowtalker    schedule 24.08.2014
comment
Спасибо @ssdecontrol - я попробую - я пытался использовать сегменты, но безрезультатно! - person Darren J; 24.08.2014
comment
Пытаюсь понять вышесказанное в контексте моего сюжетного кода! - person Darren J; 25.08.2014
comment
Я так не думаю - у меня есть два набора данных за 2003-2012 годы. Я разделил эти наборы данных на два временных периода — с января 2003 г. по декабрь 2006 г. и с января 2007 г. по декабрь 2012 г. и провел линии тренда для каждого периода. Функция abline() строит непрерывные линии. Я хочу, чтобы мои линии тренда для 2003-2006 годов были показаны только для этого периода времени и то же самое для 2007-2012 годов. Имеет ли это смысл? - person Darren J; 26.08.2014
comment
Да, теперь я понимаю. Тогда вы захотите использовать функцию segments. - person shadowtalker; 26.08.2014