将vline添加到时间序列ggplot会折叠X asis?

时间:2017-11-21 14:09:53

标签: r ggplot2 time-series

我有季度传奇绘制的数据:

z <- as.zoo(my_data)
breaks <- seq(min(time(z)), max(time(z)), .25);
autoplot(z, geom="line",ylim=c(0,75)) + scale_x_yearqtr(breaks = breaks, format = "%yQ%q")

我想在预定的位置画一条垂直线(比如1975-08-01)。

问题是,然后我添加“+ geom_vline”,我得到一个非常奇怪的折叠图表。显然,我不知道我在做什么,但我已经尝试过了:

+ geom_vline(xintercept=as.Date("1975-08-01"))
+ geom_vline(xintercept=as.numeric(as.Date("1975-08-01")))

和作为抵消(不确定它是怎么回事):

+ geom_vline(xintercept=as.numeric(z[c(10,11)]))
+ geom_vline(xintercept=as.numeric(z[10]))
+ geom_vline(xintercept=3)

这就是发生的事情(没有geom_vline就可以了):

plot image

如何设置偏移量(“在数据点X处绘制vline”)或数据(“1975-08-01”)?

我做错了什么?

添加一些数据。

  

dput(z)的   结构(c(NA,NA,NA,56.0775,58.53,58.17,61.5025,57.71,   56.5075,53.9375,47.345,48.6975,53.15,60.3125,60.2,65.1025,   63.445,57.86,62.1225,62.19,64.075,71.7725,69.565,63.4575000000001,   59.2175,53.8525,53.4175,50.1475,50.9,50.0675,52.6925,59.9325,   59.8625,61.8375,57.655,50.23,47.8775,39.5475,40.1375,43.2075,   44.885,48.115),指数=结构(c(1974,1974.08333333333,   1974.16666666667,1974.25,1974.33333333333,1974.41666666667,   1974.5,1974.58333333333,1974.66666666667,1974.75,1974.83333333333,   1974.91666666667,1975,1975.08333333333,1975.16666666667,1975.25,   1975.33333333333,1975.41666666667,1975.5,1975.58333333333,   1975.66666666667,1975.75,1975.83333333333,1975.91666666667,   1976,1976.08333333333,1976.16666666667,1976.25,1976.33333333333,   1976.41666666667,1976.5,1976.58333333333,1976.66666666667,   1976.75,1976.83333333333,1976.91666666667,1977,1977.08333333333,   1977.16666666667,1977.25,1977.33333333333,1977.41666666667   ),class =“yearmon”),frequency = 12,class = c(“zooreg”,“zoo”))

2 个答案:

答案 0 :(得分:1)

z的索引类具有类“”yearmon“

class(index(z))
## [1] "yearmon"

所以xintercept=应该一致地指定,也就是"yearmon"对象:

p <- autoplot(z, ylim=c(0,75)) + 
   scale_x_yearqtr(breaks = breaks, format = "%yQ%q")

p + geom_vline(xintercept = as.yearmon("1975-08"))

"yearmon"对象的任何其他有效规范也可以使用,例如

p + geom_vline(xintercept = as.yearmon(1975 + (8-1) / 12))

p + geom_vline(xintercept = as.yearmon(as.Date("1975-08-01")))

答案 1 :(得分:0)

正如bVa指出的那样,我使用dput来查看索引的格式。 由于日期以十进制形式存储,因此解决方案是使用简单的十进制值。 1975年至1975年的1975.67。

geom_vline(xintercept = as.numeric(1975.67))