R - 在时间序列图中绘制插值的不同颜色?

时间:2014-07-21 16:02:49

标签: r plot

有人能帮助我吗?我有一个数据集,其中包含我用动物园插值的NA值。我添加了一个“颜色列”,希望我可以创建一个线图(时间序列),其内插值以与该线的其余部分不同的颜色绘制。也就是说,由插值点之前和之后的点定义的直线段应为红色,而不是黑色。

我在这里附上了我的表格示例(颜色为“红色”定义了已经插值的值)。到目前为止,我还将图表的图像和所需的输出放在这里:

https://drive.google.com/folderview?id=0B_eJi0urUAzFM0JBS1ZIbUdGck0&usp=drive_web

到目前为止,这是我的代码。代码的'lines'部分是我希望将颜色定义为数据框中的列的地方:

par(mfrow=c(2,1), mar=c(4,4.5,2,2), mgp=c(2,0.6,0))
x.limit <- round(range(UN.GRACE.Int$DecimDate), 2)
plot(NULL, type="n", xlim=x.limit, ylim=c(-20, 25), xlab="Year", ylab="GRACE-TWS (cm)",     axes=F)
box(lwd=1.5)
abline(h=0, col="gray50", lty=1)
axis(1, seq(2003, 2012, 1), cex.axis=0.8)
axis(2, seq(-20, 25, 5), las=1, cex.axis=0.8)
minor.tick(nx=4, ny=0, tick.ratio=0.5) 
lines(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1], type="l", lwd=3, col=UN.GRACE.Int[,3])
tws.slope <- round(as.vector(coef(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]))[2]), 2)
tws.sdev <- round(as.vector(coef(summary(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1])))[,  "Std. Error"][2]), 2)
abline(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]), lwd=2.5, lty=2, col=2)
mtext(paste("Trend (cm/year): ", tws.slope, "±", tws.sdev, sep=""), cex=0.8, side=1,  line=-1.1) 

任何帮助将不胜感激 - 谢谢

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望插值点以不同的颜色显示。您可以使用R中的type="o"选项完成此操作,该选项提供过度绘制的线条。这是一些调整后的代码,可生成以下图表。我把minor.tick命令拿出来,因为它一定来自我没有的包,但是它运行正常(在我的本地机器上使用R 2.15.3)。

你会注意到我只是直接绘制项目,而不是将plot调用为NULL然后添加行。这大大简化了代码。您可以使用绘图调用中的pch参数来更改使用的符号,还可以根据需要更改lwd参数。实际上,您可以轻松地为pch为插值提供不同的值,就像您使用颜色一样 - 它接受一个向量作为参数。

par(mar=c(4,4.5,2,2), mgp=c(2,0.6,0))
x.limit <- round(range(UN.GRACE.Int$DecimDate), 2)
plot(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1],
     type="o",
     pch=18,
     col=UN.GRACE.Int[,3],
     xlim=x.limit,
     ylim=c(-20, 25),
     xlab="Year",
     ylab="GRACE-TWS (cm)",
     axes=F)
box(lwd=1.5)
abline(h=0, col="gray50", lty=1)
axis(1, seq(2003, 2012, 1), cex.axis=0.8)
axis(2, seq(-20, 25, 5), las=1, cex.axis=0.8)
tws.slope <- round(as.vector(coef(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]))[2]), 2)
tws.sdev <- round(as.vector(coef(summary(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1])))[,  "Std. Error"][1]), 2)
abline(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]), lwd=2.5, lty=2, col=2)
mtext(paste("Trend (cm/year): ", tws.slope, "±", tws.sdev, sep=""), cex=0.8, side=1,  line=-1.1)

Example of Plot using Overplot Instead of Line

如果您只想查看数据插值的点,您也可以稍后添加点。这可以按如下方式完成:

par(mar=c(4,4.5,2,2), mgp=c(2,0.6,0))
x.limit <- round(range(UN.GRACE.Int$DecimDate), 2)
plot(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1],
     type="l",
     pch=18,
     col="black",
     xlim=x.limit,
     ylim=c(-20, 25),
     xlab="Year",
     ylab="GRACE-TWS (cm)",
     axes=F)
box(lwd=1.5)
abline(h=0, col="gray50", lty=1)
axis(1, seq(2003, 2012, 1), cex.axis=0.8)
axis(2, seq(-20, 25, 5), las=1, cex.axis=0.8)
tws.slope <- round(as.vector(coef(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]))[2]), 2)
tws.sdev <- round(as.vector(coef(summary(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1])))[,  "Std. Error"][3]), 2)
abline(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]), lwd=2.5, lty=2, col=2)
mtext(paste("Trend (cm/year): ", tws.slope, "±", tws.sdev, sep=""), cex=0.8, side=1,  line=-1.1)
points(x=UN.GRACE.Int[UN.GRACE.Int$Col.CSR=="red",1],
       y=UN.GRACE.Int[UN.GRACE.Int$Col.CSR=="red",2],
       pch=16,
       col="red")

Data with Only Interpolated Points Overplotted

编辑添加:这是一种通过过度绘制原始绘图来对线段进行着色的方法,假设要着色的距离始终为长度为1。它使用了一个quick'n'dirty for()循环,但如果你想要它可以被制作成一个函数。

par(mar=c(4,4.5,2,2), mgp=c(2,0.6,0))
x.limit <- round(range(UN.GRACE.Int$DecimDate), 2)
plot(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1],
     type="l",
     pch=18,
     col="black",
     xlim=x.limit,
     ylim=c(-20, 25),
     xlab="Year",
     ylab="GRACE-TWS (cm)",
     axes=F)
box(lwd=1.5)
abline(h=0, col="gray50", lty=1)
axis(1, seq(2003, 2012, 1), cex.axis=0.8)
axis(2, seq(-20, 25, 5), las=1, cex.axis=0.8)
tws.slope <- round(as.vector(coef(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]))[2]), 2)
tws.sdev <- round(as.vector(coef(summary(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1])))[,  "Std. Error"][5]), 2)
abline(lm(UN.GRACE.Int[,2] ~ UN.GRACE.Int[,1]), lwd=2.5, lty=2, col=2)
mtext(paste("Trend (cm/year): ", tws.slope, "±", tws.sdev, sep=""), cex=0.8, side=1,  line=-1.1)

line_segs <- cbind(lstart=UN.GRACE.Int[which(UN.GRACE.Int$Col.CSR=="red")-1,c("DecimDate","CSR")],
                   lend=UN.GRACE.Int[which(UN.GRACE.Int$Col.CSR=="red")+1,c("DecimDate","CSR")])

for(x in 1:nrow(line_segs)) {

    lines(x=c(line_segs[x,1],line_segs[x,3]),
          y=c(line_segs[x,2],line_segs[x,4]),
          lwd=3,
          col="red")
}

With Overplotting of Lines