以下是我的问题(实际变量数量很大)的示例数据
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))
有没有其他方法可以将变量绘制为单个图形中具有不同颜色的线条+符号?
答案 0 :(得分:1)
如果您在调用col=2:4
(最后一个代码区块)时将col=i
替换为lapply()
,您将在图中获得正确颜色的线条。
approx()
的错误非常明显 - x
和y
参数必须是向量,并且您为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()