R 润滑间隔 class 用于标记轴

R lubridate interval class for labeling axis

这是我的 "old" 创建标签向量以标记绘图轴的方法。

require(lubridate)
require(dplyr)

#old
version <- "201710" 
endDate = as.Date(paste0(version,"01"), "%Y%m%d")                                         
startDateString = paste0(as.integer(substr(version, 1, 4)) - 3,substr(version, 5, 6))  
startDate = as.Date(paste0(startDateString,"01"), "%Y%m%d")                               
datehv <- format(seq(startDate, endDate, "3 months"), "%Y-%m")                            

zeitbereich = c()                                    
for(i in 1:(length(datehv)-1)) {              
  zeitbereich = c(zeitbereich, datehv[i], "", "")       
}
  zeitbereich = c(zeitbereich, datehv[length(datehv)])
labels <- substr(zeitbereich,1,7)

以下是新版本。这个想法是使用 lubridate 和 dplyr 以获得更好的可读性和更简单的语法

#new
version2 <- "201710"  
endDate2 = ymd(paste0(version,"01"))
startDate2 = endDate2 - dyears(3)
zeitbereich2 <- interval(startDate2, endDate2)

如何从新的时间间隔生成旧代码中的矢量 "labels"?

a) 忽略 #old

标签向量中的“”点

b) 在标签向量中加入空的“”

我会将日期保留为日期。使用seq.Date函数添加季度信息,然后在最后更改格式。

我不会改变你的循环,据我所知这是添加空格的最佳解决方案,也就是说,我会评估你为什么需要这些空格,可能有更好的方法不需要它们。

st <- as.Date("20140101", "%Y%m%d")
en <- as.Date("20170101", "%Y%m%d")

quarters <- seq.Date(from = st, to = en, "quarter")

readable <- format(quarters, as.character("%Y-%m"))

zeitbereich = c()                                    
for(i in 1:(length(readable)-1)) {              
  zeitbereich = c(zeitbereich, readable[i], "", "")       
}
zeitbereich = c(zeitbereich, readable[length(readable)])

所以最后我做到了。

df2 <- data.frame(
  date = seq(Sys.Date(), len=100, by="1 day")[sample(100, 50)],
  price = runif(50)
)
df2 <- df2[order(df$date), ]

st2 <- ymd("19960101")
en2 <- ymd("20000201")
months2 <- seq.Date(from = st2, to = en2, by = "month")

mutate(df2, date=months2)

b <- ggplot(df, aes(x=date, y=price)) + geom_line()
b + scale_x_date(date_breaks = "2 months")

日期列必须是日期 class 才能使 scale_x_date 生效。但是这样可以将日期设置为任何需要的时间(例如“3 年”)。