R 中 x 轴上带有年份的月度时间序列图

Monthly time series plot with years on x-axis in R

如果能帮助我在 R 中创建时间序列图,我将不胜感激。我是一个新手,我的编程知识非常有限。我只需要创建一个图表,它必须在 R 中完成,而不是 Excel。

我有以下每月数据:

Time   HML
200207 6.28 
200208 3.44
200209 8.03
...
201412 1.47

我真的很难理解时间变量是如何定义的或者它应该如何转换。

现在我需要绘制它,以便在 X 轴上只有年份可见,即 2002、2003、2004、(...)、2014。

这是我的代码:

plot(HML, type="l", lwd=2, col="red", ylab= "% return")
abline(h = 0, col = "black", lty = "solid")

非常感谢任何帮助。

此致, 马丁

首先,创建一个时间序列对象! (使用 ts()

然后绘图,我猜 R 会自动在 X 轴上只显示年份!

#make Time to time series object
a<-ts(rnorm(150),start=c(2002,7),freq=12);a
plot(a, type="l", lwd=2, col="red", ylab= "% return",xlim=c(2002,2014),axes=F)
axis(1,at=2002:2014,labels=2002:2014);axis(2);box()

解释码:

  1. start in ts()表示第一次观察的次数
  2. freq 表示每单位时间的观察次数。
  3. 我们可以通过xlim!
  4. 来控制X轴的范围
  5. 我不知道如何通过代码轻松显示所有年份,但我一直使用的一个愚蠢的方法是自己创建一个。因此,在绘图中添加 axes=F 意味着不显示默认轴。然后,创建我希望 axis()label 显示所有年份的轴!
  6. 最后,在你的照片周围画一个方框!

顺便说一句,您可以通过在 R 中输入 ?ts 来找到更多详细信息!

读入数据使用read.zoo和class"yearmon"(代表年月)作为索引。然后使用 xaxt="n" 绘制它以抑制轴。最后使用 axis 仅强制年份自己生成轴:

Lines <- "Time   HML
200207 6.28 
200208 3.44
200209 8.03
201412 1.47"

library(zoo)
HML <- read.zoo(text = Lines, header = TRUE, FUN = as.yearmon, format = "%Y%m",
 colClasses = c("character", NA))

plot(HML, xaxt = "n", type = "o", xlab = "Year")
rng <- range(floor(time(HML)))
axis(1, rng[1]:rng[2])

图像后继续。

注1:如果你已经有数据作为数据框DF

DF <- read.table(text = Lines, header = TRUE)

那么您可以将 read.zoo 语句替换为:

HML <- zoo(DF$HML, as.yearmon(as.character(DF$Time), "%Y%m"))

注2:我无法判断实际数据是否有从第一个月到最后一个月的每个月的数据,但即使没有,上面的工作也是如此。

实现这一目标的方法有很多...这是其中之一。我们将使用从 2002-01 到 2012-12 的假设数据(在这种情况下有差距并​​不重要)。请注意,我们使用每个月的 1 日作为完整日期,可以通过函数 as.POSIXct 轻松识别,该函数会将字符串转换为时间对象。

Time <- c("2002-01-01", "2002-02-01", "2003-03-01", "2003-04-01", 
          "2004-05-01", "2004-06-01", "2005-07-01", "2005-08-01", 
          "2006-09-01", "2006-10-01", "2006-11-01", "2008-01-01", 
          "2008-02-01", "2009-02-01", "2009-03-01", "2010-04-01", 
          "2010-05-01", "2010-06-01", "2011-07-01", "2011-08-01", 
          "2012-09-01", "2012-10-01", "2012-11-01", "2012-12-01")

HML <- rnorm(n = 24, mean = 6, sd = 2)

dat <- data.frame(Time=as.POSIXct(Time), HML)
rm(Time, HML)

然后使用plot函数:

plot(HML ~ Time, type="l", col="red", lwd=2, ylab= "% return", data=dat)

使用ggplot2会给你很多选择。 autoplot 函数接受并绘制 zoo 个对象。

library(ggplot2)
library(magrittr)
library(zoo)

hml_ts <-
  ts(rnorm(150),start=c(2002,7),freq=12)

hml_zoo <-
  as.zoo(hml_ts)

gg <-
  hml_zoo %>%
    autoplot() + 
    xlim(c(2002, end(hml_zoo)))

gg