问题描述
以下带有 plot.zoo()
的时间序列图显示了奇怪数量的(只有一个)x 轴刻度。如何说服 plot.zoo()
显示更多 x 轴刻度?
## Create a dummy time series
library(xts)
start <- as.Date("2020-04-01")
end <- as.Date("2021-06-02")
dat <- seq(start,end,length.out = 226)
set.seed(271)
ts <- xts((1:226) + rnorm(226,sd = 1/3),order.by = dat)
plot.zoo(ts) # => only one x-axis tick displayed
我尝试了通常更改 x 轴的方法,但由于某种原因 (?) axis()
在这里不受尊重:
## Trial
plot.zoo(ts,xaxt = "n")
ticks <- axTicksByTime(index(ts))
labels <- names(ticks)
axis(1,at = ticks,labels = labels) # => no x-axis ticks displayed
如果您需要更多详细信息,请告诉我。
解决方法
这是一个基于标准 plot()
的版本:
plot(as.numeric(ts),type = "l",xaxt = "n")
ticks <- axTicksByTime(index(ts),format.labels = "%Y-%m-%d")
labels <- names(ticks)
axis(1,at = ticks,labels = labels)
还有一个更好的:
plot(as.numeric(ts),xaxt = "n",xlab = "",ylab = "ts")
ticks <- axTicksByTime(index(ts),format.labels = "%Y-%m")
labels <- names(ticks)
axis(1,labels = labels,las = 2)
,
题中的代码有几个问题:
问题中的代码调用了
plot.zoo
,它直接调用了 zoo 方法。一般来说,代码应该调用泛型并让它调度方法而不是直接调用方法。 (必须直接调用该方法的主要情况是泛型出现在当前未加载的不同包中;但是,plot
不是这种情况,因为它是基 R 的一部分。)>-
?axTicksByTime
表示此函数是为内部使用而编写的 -
如果您无论如何都想使用
axTicksByTime
,请注意它将索引返回到时间向量中,而不是时间本身。这就是问题使用axis
命令时什么都没有出现的原因。
如果您无论如何都想使用 axTicksByTime
并将其与 plot
的 zoo 方法一起使用,那么可以这样做。
plot(as.zoo(ts),xaxt = "n")
ticks <- axTicksByTime(ts,format = "%Y %m")
labels <- names(ticks)
axis(1,at = time(ts)[ticks],labels = labels)