使用R在一个图中具有缺失值的不同变量的彩色线图

时间:2013-08-25 21:00:02

标签: r time-series lapply

以下是我的问题(实际变量数量很大)的​​示例数据

date<-seq(as.Date("2000/1/1"), by = "month", length.out = 12)
v1<-seq(2,32, length.out=12)
v2<-c(11,NA,30,NA,NA,35,NA,40,48,NA,55,64)
v3<-c(5,NA,NA,NA,22,25,NA,30,NA,NA,45,NA)
as.POSIXlt(date, format="%Y/%m/%d")
df<-data.frame(date, v1, v2, v3)

要一次性绘制所有变量,我正在使用:

matplot(df[,1], df[2:ncol(df)], type='p', pch=2:4, col=2:4)

现在我想通过线连接所有点,但是'matlines'不能插入缺失值发生的位置。我没有在'matplot'中使用type ='b',因为它仅为v1绘制连续线(即连续数据)。

但是,插值的一种方法是使用“近似”功能。所以我试过

matplot(approx(df[,1], df[2:ncol(df)], n= length(df[[1]])), type='p', pch=2:4, col=2:4)

但是R抛出一个错误:“Error in xy.coords(x, y) : 'x' and 'y' lengths differ

现在作为最后的手段,我尝试'lapply'在符号上叠加线条,但在这种情况下,不同的颜色不会显示不同的变量!!

lapply(2:4, function(i) lines(
  approx(df[,1],
         df[[i]], n= length(df[[1]])),
  lty=2, col=2:4))

有没有其他方法可以将变量绘制为单个图形中具有不同颜色的线条+符号?

2 个答案:

答案 0 :(得分:1)

如果您在调用col=2:4(最后一个代码区块)时将col=i替换为lapply(),您将在图中获得正确颜色的线条。

approx()的错误非常明显 - xy参数必须是向量,并且您为y提供了data.frame 。分别对每列使用approx(),它可以正常工作。

df_approx = matrix(nrow = nrow(df), ncol = 3)
for(i in 2:4) df_approx[,i-1] = approx(df[,1], df[,i], n=length(df[[1]]) )$y
matplot(df[,1], df_approx)

答案 1 :(得分:1)

以下是使用ggplot

的替代解决方案
library(reshape2)
library(ggplot2)

# melt the data frame df from wide format (three columns V1-V3 with values on the same measured variable)
# to long format (one column "variable" with three different levels, and one "value" with the measurements)
df2 <- melt(df, id.vars = "date")

# remove rows with missing "value"
df3 <- df2[!is.na(df2$value), ]

# plot value ~ date, coloured by 'variable'
ggplot(data = df3, aes(x = date, y = value, col = variable)) + geom_point() + geom_line()