用R绘制每月时间序列应该更简单

时间:2018-10-21 16:06:10

标签: r plot time-series

R可能同时强大而令人沮丧。这使得向非统计人员(在我的情况下是商科学生)教授R颇具挑战性。让我用一个简单的任务说明一下。

假设您正在使用每月时间序列数据集。大多数业务数据通常以每月时间序列的形式绘制。我们希望对数据进行绘制,以便x轴描述月份和年份的组合。例如,2017年1月可以描述为2017-01。使用plot命令应该很简单。不是。

数据生成 让我们用一个例子来说明。我将从2007年1月开始至2017年12月结束,生成每月随机数据,其中包含120个观测值的每月数据,这些观测值代表10年的信息。

set.seed(1234)
x <- rnorm(120)
d <-.07
y <- cumsum(x+d)*-1

由于我们尚未将数据声明为时间序列,因此使用 plot 命令对其进行绘制将不会返回x轴的预期标签。请参见下面的代码和图表。

plot(y, type="l")

enter image description here

现在 plot plot.ts 命令中应该有一个选项可以显示特定于时间序列的x轴。我找不到一个。所以这是解决方法。

  1. 将数据集声明为时间序列。
  2. 使用 tsp seq 生成所需的x轴标签。
  3. 绘制图表,但抑制x轴。
  4. 使用axis命令添加自定义x轴标签。
  5. 添加一个额外的步骤以在2012年绘制一条垂直线。

这是代码。

my.ts <- ts(y, start=c(2007, 1), end=c(2017, 12), frequency=12)    
tsp = attributes(my.ts)$tsp
dates = seq(as.Date("2007-01-01"), by = "month", along = my.ts)
plot(my.ts, xaxt = "n", main= "Plotting outcome over time",
     ylab="outcome", xlab="time")
axis(1, at = seq(tsp[1], tsp[2], along = my.ts), labels = format(dates, "%Y-%m"))
abline(v=2012, col="blue", lty=2, lwd=2)

结果如下图所示。 enter image description here

对于大多数数据科学家来说,这是一个可行的解决方案。但是,如果您的受众是商科学生或专业人士,则有太多的代码行需要编写。

问题:是否可以使用带有带有控制x轴显示方式的format选项的plot命令绘制时间序列变量(对象)?

-

3 个答案:

答案 0 :(得分:4)

我认为问题归结为想要为您想到的自定义轴提供预编写的功能。请注意,plot(my.ts)确实给出了一个带有每月刻度和标签的图表,对我来说,它看起来比问题中显示的图表要好,但是如果您想使用自定义轴,因为R是一种编程语言,那么您肯定可以编写一个简单的图表函数,从那时起,只需调用该函数即可。

例如,要开始使用,它是一个接受频率为12 ts对象的函数。它绘制一个带有刻度的X轴,每个月标记年份和每个月,每个参数都可以除以12。默认值是3,因此每三个月显示一个标签(Jan除外,显示为那一年)。 len是所显示月份的字母数,可以为1、2或3。1表示将Jul表示为J,2表示Ju且3表示7月。默认值为1。

xaxis12 <- function(ser, every = 3, len = 1) {
  tt <- time(ser)
  axis(side = 1, at = tt, labels = FALSE)

  is.every <- cycle(ser) %in% seq(1, 12, every)[-1]
  month.labs <- substr(month.abb[cycle(ser)][is.every], 1, len) 
  axis(side = 1, at = tt[is.every], labels = month.labs, 
    cex.axis = 0.7, tcl = -0.75)

  is.jan <- cycle(ser) == 1
  year.labs <- sprintf("'%02d", as.integer(tt)[is.jan] %% 100)
  axis(side = 1, at = tt[is.jan], labels = year.labs, 
    cex.axis = 0.7, tcl = -1)
}

# test
plot(my.ts, xaxt = "n")
xaxis12(my.ts)

screenshot

答案 1 :(得分:3)

ggplot2软件包具有scale_x_date功能,可按所需的比例尺,标签,间隔和限制(日,月,年格式)绘制时间序列。 您只需要date类对象和值y。例如。

dates = seq(as.Date("01-01-2007",  format = "%d-%m-%Y"), length.out = 120, by = "month")
df <- data.frame(dates, y)  

# use the format you need in your plot using scale_x_date
library(ggplot2)
ggplot(df, aes(dates, y)) + geom_line() + scale_x_date(date_labels = "%b-%Y") +
geom_vline(xintercept = as.Date("01-01-2012",  format = "%d-%m-%Y"), linetype = 'dotted', color = 'blue')

y vs dates

答案 2 :(得分:2)

Gabor亮相。它实际上仅取决于您想要什么,以及您愿意挖掘或更改的内容。这是一个使用较新的和鲜为人知的软件包的简单替代方法,非常适合绘制xts类型:

## alternative
library(rtsplot)            # load the plotting package
library(xts)                # load the xts time-series container package
xx <- as.xts(my.ts)         # create an xts object
rtsplot(xx, main= "Plotting outcome over time")
rtsplot.x.highlight(xx, which(index(xx)=="Jan 2012"), 1)

如您所见,绘图是两个调用-rtsplot有很多 nice 默认值。下面是我很懒的屏幕截图,绘图窗口当然没有标题栏...

enter image description here