在R中绘制时间序列

时间:2011-10-17 22:57:01

标签: r plot time-series

我正在处理数据,前两列是日期,第三列是符号,第四列和第五列是价格。 所以,我创建了一个数据子集如下:

test.sub<-subset(test,V3=="GOOG",select=c(V1,V4)

然后我尝试使用以下

绘制时间序列图
as.ts(test.sub)
plot(test.sub)
好吧,它给了我一个散点图 - 不是我想要的。 所以,我试过plot(test.sub[1],test.sub[2]) 现在我收到以下错误:

Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ

确保没有。行是相同的,我运行nrow(test.sub[1])nrow(test.sub[2])并且它们都返回相同的行,所以作为R的新手,我不确定修复是什么。

我也运行了plot.ts(test.sub),但是它没有显示x轴上的日期,它与plot(test.sub)一起使用,这是我想看到的。

test.sub[1]
              V1
1107 2011-Aug-24
1206 2011-Aug-25
1307 2011-Aug-26
1408 2011-Aug-29
1510 2011-Aug-30
1613 2011-Aug-31
1718 2011-Sep-01
1823 2011-Sep-02
1929 2011-Sep-06
2035 2011-Sep-07
2143 2011-Sep-08
2251 2011-Sep-09
2359 2011-Sep-13
2470 2011-Sep-14
2581 2011-Sep-15
2692 2011-Sep-16
2785 2011-Sep-19
2869 2011-Sep-20
2965 2011-Sep-21
3062 2011-Sep-22
3160 2011-Sep-23
3258 2011-Sep-26
3356 2011-Sep-27
3455 2011-Sep-28
3555 2011-Sep-29
3655 2011-Sep-30
3755 2011-Oct-03
3856 2011-Oct-04
3957 2011-Oct-05
4059 2011-Oct-06
4164 2011-Oct-07
4269 2011-Oct-10
4374 2011-Oct-11
4479 2011-Oct-12
4584 2011-Oct-13
4689 2011-Oct-14

str(test.sub)
'data.frame':   35 obs. of  2 variables:
 $ V1:Class 'Date'  num [1:35] NA NA NA NA NA NA NA NA NA NA ...
 $ V4: num  0.475 0.452 0.423 0.418 0.403 ...

head(test.sub) V1 V4 
1212 <NA> 0.474697 
1313 <NA> 0.451907 
1414 <NA> 0.423184 
1516 <NA> 0.417709 
1620 <NA> 0.402966 
1725 <NA> 0.414264 

现在这个工作正常,我想添加一个第三个变量来绘制一个三维图表 - 任何建议我如何做到这一点。 THX!

3 个答案:

答案 0 :(得分:14)

所以我认为这里有一些值得讨论的事情:

首先,一些示例数据:

test <- data.frame(End = Sys.Date()+1:5, 
               Start = Sys.Date()+0:4, 
               tck = rep("GOOG",5), 
               EndP= 1:5, 
               StartP= 0:4)

test.sub = subset(test, tck=="GOOG",select = c(End, EndP))

首先,请注意test和test.sub都是数据帧,因此像test.sub[1]这样的调用并不真正意味着“R”的任何内容。**写test.sub[,1]更多的是R-ish凭借与其他R结构的一致性。如果您比较str(test.sub[1])str(test.sub[,1])的结果,您会看到R稍微区别对待它们。

你说你输入了:

as.ts(test.sub)
plot(test.sub)

我猜你在某种OO语言方面有丰富的经验;虽然R确实有一些OO味道,但它不适用于此。不是将test.sub转换为类ts的东西,而是仅进行转换并将其抛弃,然后继续绘制您开始使用的数据框。这很容易解决:

test.sub.ts <- as.ts(test.sub)
plot(test.sub.ts)

但是,这可能不是你想要的。相反,R创建一个时间序列,其中包含两个名为“End”的变量(现在是强制转换为整数的日期)和“EndP”。像这样的有趣的业务是像动物园和xts这样的时间序列包已经流行的部分原因,所以我会详细介绍它们。

(不幸的是,据我所知,R不会使用默认的ts类保留日期戳,而是选择保留开始和结束日期以及频率。对于更一般的时间序列工作,这很少足够灵活)

您可以通过输入

来获得所需内容
plot(test.sub[,1], test.sub[,2]) 

而不是

plot(test.sub[1], test.sub[2])

因为前者遇到麻烦,因为你传递了两个子数据帧而不是两个向量(即使它看起来像你的那样)。 *

无论如何,使用xts(同样适用于动物园):

library(xts) # You may need to install this
xtemp <- xts(test.sub[,2], test.sub[,1]) # Create the xts object
plot(xtemp) 
# Dispatches a xts plot method which does all sorts of nice time series things

希望其中一些有用并且对于未被识别的内联代码感到抱歉:仍然习惯于堆栈溢出。

迈克尔

**实际上,他们访问内部用于构建数据框的列表,但这比代码值得依赖的代码更具细微差别。

***实质是当你将plot(test.sub[1], test.sub[2])传递给R时,它调度方法plot.data.frame,该方法占用一个数据帧,并尝试将第二个数据帧解释为附加的图在某个地方被误解的参数,给出了你的错误。

答案 1 :(得分:2)

如果您在引发错误后立即执行回溯,那么您获得有关不同xy长度的错误的原因立即显而易见:

> plot(test.sub[1],test.sub[2])
Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ
> traceback()
6: stop("'x' and 'y' lengths differ")
5: xy.coords(x, y, xlabel, ylabel, log)
4: plot.default(x1, ...)
3: plot(x1, ...)
2: plot.data.frame(test.sub[1], test.sub[2])
1: plot(test.sub[1], test.sub[2])

你的电话中的问题是多方面的。首先,如@mweylandt test.sub[1]所述,是一个包含单个组件的数据框,而不是由test.sub的第一个组件的内容组成的向量。

从回溯中,我们看到调用了plot.data.frame方法。 R很乐意绘制数据框,只要它至少有两列。 R接过你的话并将test.sub[1](作为data.frame)传递给plot() - test.sub[2]永远不会查看。test.sub[1]最终传递给{ {1}}正确通知您xy.coords()有很多行,x有0行,因为y只包含一个组件。

如果您已完成test.sub[1]或使用公式界面命名变量plot(test.sub[,1], test.sub[,2], type = "l"),那将会有效,如我在其他答案中所示。

答案 2 :(得分:1)

当然,使用公式界面更容易:

> test <- data.frame(End = Sys.Date()+1:5, 
+                Start = Sys.Date()+0:4, 
+                tck = rep("GOOG",5), 
+                EndP= 1:5, 
+                StartP= 0:4)
> 
> test.sub = subset(test, tck=="GOOG",select = c(End, EndP))
> head(test.sub)
         End EndP
1 2011-10-19    1
2 2011-10-20    2
3 2011-10-21    3
4 2011-10-22    4
5 2011-10-23    5
> plot(EndP ~ End, data = test.sub, type = "l")

我广泛使用时间序列类型数据,很少(如果有的话)需要"ts"类对象。包 zoo xts 非常有用,但如果您只想绘制数据,i)将日期/时间信息正确格式化/设置为"Date""POSIXt"类对象,然后ii)只使用标准图形和type = "l"(或type = "b"type = "o"绘制它,如果您想查看观察结果次)。