首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中绘制时间序列

在R中绘制时间序列
EN

Stack Overflow用户
提问于 2011-10-18 06:57:01
回答 3查看 11.7K关注 0票数 2

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

代码语言:javascript
复制
test.sub<-subset(test,V3=="GOOG",select=c(V1,V4)

然后,我尝试使用以下内容绘制时间序列图

代码语言:javascript
复制
as.ts(test.sub)
plot(test.sub)

好吧,它给了我一个散点图-不是我想要的。所以,我尝试了plot(test.sub[1],test.sub[2]),现在我得到了以下错误:

代码语言:javascript
复制
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)上所做的,这也是我希望看到的。

代码语言:javascript
复制
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 

现在这是工作,我想添加第三个变量来绘制3d图表-任何建议,我可以做到这一点。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-18 08:02:37

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

首先是一些示例数据:

代码语言:javascript
复制
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来说并不真正“意味着”任何东西。**由于与其他R结构的一致性,编写test.sub[,1]更具R-ish风格。如果比较str(test.sub[1])str(test.sub[,1])的结果,就会发现R对待它们的方式略有不同。

你说你输入了:

代码语言:javascript
复制
as.ts(test.sub)
plot(test.sub)

我猜您对某种面向对象语言有丰富的经验;虽然R确实有一些面向对象的风格,但它不适用于这里。这并不是将test.sub转换为ts类的内容,而是执行转换并丢弃它,然后继续绘制您开始使用的数据框。这是一个很容易解决的问题:

代码语言:javascript
复制
test.sub.ts <- as.ts(test.sub)
plot(test.sub.ts)

但是,这可能也不是你想要的。相反,R创建了一个时间序列,它有两个变量,名为"End“(这是现在被强制转换为整数的日期)和"EndP”。像这样有趣的事情是像zoo和xts这样的时间序列包流行起来的部分原因,所以我将更详细地介绍它们。

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

您也许可以通过键入以下命令来获得您想要的内容

代码语言:javascript
复制
plot(test.sub[,1], test.sub[,2]) 

而不是

代码语言:javascript
复制
plot(test.sub[1], test.sub[2])

由于前者遇到了麻烦,因为您传递的是两个子数据帧,而不是两个向量(尽管看起来像是).*

无论如何,使用xts (对于zoo也是类似的):

代码语言:javascript
复制
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,该方法获取单个数据帧,并尝试将第二个数据帧解释为附加的绘图参数,该参数在整个过程中会被误解,从而给出错误。

票数 14
EN

Stack Overflow用户

发布于 2011-10-18 17:01:53

如果您在引发错误后立即进行回溯,则得到有关不同xy长度的错误的原因是显而易见的:

代码语言:javascript
复制
> 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]最终被传递给xy.coords(),它正确地告诉您x有很多行,但y有0行,因为test.sub[1]只包含一个组件。

如果您使用plot(test.sub[,1], test.sub[,2], type = "l")或使用公式接口将变量命名为plot(V4 ~ V1, data = test.sub, type = "l"),如我在另一个答案中所示,它将会起作用。

票数 2
EN

Stack Overflow用户

发布于 2011-10-18 16:54:09

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

代码语言:javascript
复制
> 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"类的对象。包zooxts非常有用,但是如果您想要做的只是绘制数据,i)获得格式正确的日期/时间信息/设置为"Date""POSIXt"类对象,然后ii)只需使用标准图形和type = "l" (如果您想查看观测时间,则可以使用type = "b"type = "o" )绘制它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7800579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档