【问题标题】:Plotting from a data frame that contains one or more time series从包含一个或多个时间序列的数据框中绘制
【发布时间】:2012-05-13 15:17:56
【问题描述】:

我定期构建一个带有时间值(源自 xts 或 zoo 对象)的数据框,用于分析和绘图。这是一个例子:

library(xts)   

x1 <- xts(rnorm(10), as.Date("2012-01-01") + 0:9)   
x2 <- xts(rnorm(10), as.Date("2012-01-04") + 0:9)   

(df <- data.frame(merge(x1=x1, x2=x2), v1=4:16, v2=rnorm(13)))    

                   x1          x2 v1          v2   
2012-01-01  0.1930827          NA  4  1.05972724   
2012-01-02  0.4429592          NA  5 -1.89299068   
2012-01-03  1.6657630          NA  6  0.70445966  
2012-01-04 -0.2765922 -0.26728223  7  0.35336959   
2012-01-05 -0.1756590 -2.04888130  8  0.90129924  
2012-01-06 -2.4849132  0.49400975  9  1.54486914  
2012-01-07 -0.9993353 -1.09308203 10  1.16600015  
2012-01-08 -0.7326309  0.55781566 11  0.37178542  
2012-01-09 -0.2973543 -0.59872496 12  0.07512468  
2012-01-10 -1.5061380  0.08567125 13  1.77494367  
2012-01-11         NA  0.81835375 14 -0.38211167  
2012-01-12         NA  1.30131894 15 -1.09220795  
2012-01-13         NA -1.29505649 16  1.27148069  

要绘制时间序列,我需要使用as.Date(row.names(df)) 作为横轴。例如:

plot(as.Date(row.names(df)), df$x1, type="l", xlab="", ylab="Test", main="Using row.names()", col="red")   
lines(as.Date(row.names(df)), df$x2, col="blue")    
lines(as.Date(row.names(df)), df$v2, col="green")    

一遍又一遍地使用as.Date(row.names(df)) 真的很痛苦,所以在过去,我使用以下代码在数据框中添加了一个列:

(df <- cbind(df, tim=as.Date(row.names(df))))    

我现在可以将时间序列绘制为:

with(df, {  
  plot(tim, x1, type="l", xlab="", ylab="Test", main="Using a new tim column", col="red")  
  lines(tim, x2, col="blue")  
  lines(tim, v2, col="green")  
})

此技术有效,但添加 tim 列感觉草率。有没有更好/更清洁的方法来做到这一点?

编辑 1 (2012-05-13) ====================================

我使用数据框的原因是因为这些数据通常被提供给需要数据框的一个或多个包,和/或因为我通常需要在某些变量中表示非数字数据。

【问题讨论】:

  • data.frame 不能“包含”xts/zoo 值。 data.frame() 通过as.data.frame... 中的每个对象转换为data.frame。所以,这个问题实际上与 xts/zoo 对象没有任何关系。
  • @Joshua - 我应该更改标题并删除标签吗?
  • 这可能有助于获得可以提供帮助的人的更多关注,尽管我认为您添加 tim 列的解决方案可能是最简单和最直接的解决方案。

标签: r plot dataframe


【解决方案1】:

我会尽可能坚持动物园设施:

library(xts)   
x1 <- xts(rnorm(10), as.Date("2012-01-01") + 0:9)   
x2 <- xts(rnorm(10), as.Date("2012-01-04") + 0:9)   

dz <- merge(x1=x1, x2=x2); dz$v1=4:16; dz$v2=rnorm(13)    
 # keeps it a zoo object rather than a data.frame

with(dz, plot( x1, type="l", xlab="", ylab="Test", main="Not using row.names()\nStick with zoo" ) )
lines( dz$x2, col="blue")    
lines( dz$v2, col="green")

【讨论】:

  • 我应该更具体地说明对数据框的需求。我在问题末尾添加了 Edit 1。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2020-11-08
  • 1970-01-01
  • 2019-12-02
  • 2022-01-06
  • 2021-11-29
相关资源
最近更新 更多