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")
现在 plot 或 plot.ts 命令中应该有一个选项可以显示特定于时间序列的x轴。我找不到一个。所以这是解决方法。
这是代码。
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)
对于大多数数据科学家来说,这是一个可行的解决方案。但是,如果您的受众是商科学生或专业人士,则有太多的代码行需要编写。
问题:是否可以使用带有带有控制x轴显示方式的format选项的plot命令绘制时间序列变量(对象)?
-
答案 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)
答案 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')
答案 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 默认值。下面是我很懒的屏幕截图,绘图窗口当然没有标题栏...