如何在R中的同一图上绘制两个不同长度的简单时间序列

时间:2017-05-25 18:31:06

标签: r time-series ggplot2

我有两个简单的时间序列数据集,我想在同一个图上绘制。

诀窍是,数据集的长度不同,日期范围完全不同:

数据集1

|-----------|--------| 
| Date      | Visits | 
| 2/14/2013 | 1      | 
| 2/18/2013 | 3      | 
| 2/19/2013 | 1      | 
| 2/20/2013 | 12     | 
| 2/21/2013 | 10     | 
| 2/22/2013 | 11     | 

数据集2

|----------|--------| 
| Date     | Visits | 
| 5/1/2015 | 19     | 
| 5/2/2015 | 4      | 
| 5/3/2015 | 10     | 
| 5/4/2015 | 27     | 
| 5/5/2015 | 12     | 
| 5/6/2015 | 6      | 
| 5/7/2015 | 1      | 
| 5/8/2015 | 4      | 

我想将它们缩放到相同的范围并使它们保持日期不变,这样我就可以在同一个地块上绘制它们,只是为了观察一般趋势(在接近结束或接近开始时是否增加了访问量等) 。

我觉得我必须错过一个简单的概念,因为我不认为这应该很难。这可以在R吗?

1 个答案:

答案 0 :(得分:1)

如果你的两个时间序列作为data.frames存在,你可以像

那样接近它
df1 <- data.frame(Date=c("2/14/2013",paste0("2/",as.character(18:22),"/2013")),Visits=c(1,3,1,12,10,11))
df2 <- data.frame(Date=paste0("5/",as.character(1:8),"/2015"),Visits=c(19,4,10,27,12,6,1,4))

# turn dates into Dates
df1$Date <- as.Date(df1$Date, format="%m/%d/%Y")
df2$Date <- as.Date(df2$Date, format="%m/%d/%Y")

这可以是一种简单的添加剂偏移的快速方法:

offset <- min(df2$Date) - min(df1$Date)   # this would make them start at the same place

df2.1 <- df2
df2.1$Date <- df2.1$Date - offset

plot(df1, xlim=range(c(df1$Date,df2.1$Date)),ylim=range(c(df1$Visits,df2$Visits)), type='l',col=2)
lines(df2.1,col=4)

请注意,这有点令人讨厌,因为x轴上的日期仅与第一个数据集有关。一个hacky解决方法是将它们都转换为数字。

df1$Date_n <- as.numeric(df1$Date)
df2$Date_n <- as.numeric(df2$Date)

......也许让他们都从第1天开始。

df1$Date_n <- df1$Date_n - min(df1$Date_n) + 1
df2$Date_n <- df2$Date_n - min(df2$Date_n) + 1

可能包含相对于df2

绘制df1的偏移量和比例
offset <- 0
scale <- 1
df2$Date_n1 <- df2$Date_n*scale + offset

plot(df1$Date_n, df1$Visits, type='l', col=2, xlim=range(c(df1$Date_n,df2$Date_n1)), ylim=range(c(df1$Visits,df2$Visits)), xlab="day", ylab="Visits")
lines(df2$Date_n1, df2$Visits, col=4)
legend("topleft", legend=c("series 1","series2"),lwd=1,col=c(2,4))

也许不是最优雅的解决方案,但它应该让你在那里,希望最小的调整。