夏令时休息R ggplot日期时间轴

时间:2018-12-11 15:10:48

标签: r datetime ggplot2

我有一个在X轴上带有日期的图,我想添加阴影以区分周末和节假日。我想我可以使用POSIXct做到这一点。我定义了一个函数来确定一天是否是周末:

weekend<-function(data) {
  d<-weekdays(data)
  ifelse (d %in% c("niedziela","sobota", "Sunday", "Sun", "Saturday", "Sat"), "weekend", "working")
}

然后,我定义我的数据集-实际的数据集和周末表格:

dates=as.character(seq(as.Date("2018-10-24"), as.Date("2018-11-01"), "day"))
numbers=rnorm(length(dates))

tabela=data.table(dates=as.POSIXct(dates), numbers=numbers)
tabela[,day_type:=weekend(dates)]

tab_weekend<-tabela[day_type=='weekend']
tab_weekend[,Start:=dates-12*60*60+1]
tab_weekend[,Stop:=dates+12*60*60]

然后我将数字绘制为一条线,将周末绘制为灰色矩形。

g<-ggplot(tabela)+
  geom_line(aes(dates, numbers))+
  geom_rect(data=tab_weekend, aes(xmin=Start, xmax=Stop, ymin=-Inf, ymax=+Inf), 
            fill='gray65', alpha=0.2)+
  scale_x_datetime(labels=function(x) format(x, "%Y-%m-%d %H:%M"))

到目前为止很好:

enter image description here

但是如果我现在使用更大范围的日期,

dates=as.character(seq(as.Date("2018-10-01"), as.Date("2018-11-01"), "day"))

我每周都会得到一次滴答,这本身不是问题,但是现在最后一个滴答显示了错误的日期。低于29.10。 (星期一)说28.10。 23:00。

enter image description here

我猜这是因为28.10。是冬季的第一天,所以有25个小时。但是,如何解决它以显示正确的日期呢?

编辑:建议使用{_3}}中的date_format和tz参数。但是,

scale_x_datetime(labels=date_format("%Y-%m-%d", tz = "Europe/Berlin"))

我仍然看到10-15、10-22和10-28的价格变动。

1 个答案:

答案 0 :(得分:1)

我认为您是对的,这是一个时区问题,我可以在荷兰(CET或夏季的CEST)在此处进行复制。

但是,如果您完全停止思考date-times,那么我想解决它会更容易。它取决于您的真实数据,但看起来您每天都有数据,而时间却没有任何实际意义。
您也可以在示例中看到:所有数字都是在一天的开始,午夜绘制的。如果您要绘制一些总是在午夜时分进行的测量,那么这是有道理的,但是如果您绘制出一整天都在进行的测量,则没有意义。
另外,如现在所绘制的,您定义了一个奇怪的周末类型:它始于星期五中午,结束于星期日中午。

因此,仅使用日期可能更有意义,当我更改代码时,我得到了这个(我也将日期转换为字符,这是不必要的):

 dates=seq(as.Date("2018-10-24"), as.Date("2018-11-01"), "day")
 numbers=rnorm(length(dates))

 tabela=data.table(dates=dates, numbers=numbers)
 tabela[,day_type:=weekend(dates)]

 tab_weekend<-tabela[day_type=='weekend']
 tab_weekend[,Start:=dates-.5]
 tab_weekend[,Stop:=dates+.5]

 print(g<-ggplot(tabela)+
         geom_line(aes(dates, numbers))+
         geom_rect(data=tab_weekend, aes(xmin=Start, xmax=Stop, ymin=-Inf, ymax=+Inf), 
                   fill='gray65', alpha=0.2)+
         scale_x_date(labels=function(x) format(x, "%Y-%m-%d")))