如何使用时间变量正确格式化 x 轴?

how to format properly the x axis with a time variable?

考虑这个简单的例子

tibble(date = seq.Date(from = ymd('2019-01-01'),
                       to = ymd('2019-06-01'), 
                       by = 'days')) %>% 
  mutate(var = rnorm(n())) %>% 
  barchart(var ~ date, data = ., horiz = FALSE)

这里显然x轴乱了。标签太多了!如何减少日期刻度数?

理想情况下,可以像 ggplot 那样使用 scales::pretty_breaks() 函数,但在这里我什至无法手动完成:

myseq <- seq.Date(from = ymd('2019-01-01'),
                      to = ymd('2019-06-01'), 
                      by = '7 days') 

tibble(date = seq.Date(from = ymd('2019-01-01'),
                       to = ymd('2019-06-01'), 
                       by = 'days')) %>% 
  mutate(var = rnorm(n())) %>% 
  barchart(var ~ date, data = ., horiz = FALSE,
           scales = list(x = list(at = myseq, rot = 45)))

简单地删除所有 x 标签!! 你怎么看?我只需要 lattice 解决方案。

谢谢!

ggplot() 很好地默认了这个,在这种情况下打破了几个月:

library(tidyverse)
library(lubridate)

tibble(
  date = seq.Date(
    from = ymd('2019-01-01'),
    to = ymd('2019-06-01'), 
    by = 'days')) %>% 
  mutate(var = rnorm(n())) %>%
  ggplot() +
    geom_line(mapping = aes(x = date, y = var))

要使用 lattice,首先将你的 tibble 存储为对象,使用 seq() 设置间隔 (at),然后 as.Date() 设置 labels 并使用相同的 seq().

索引日期列
df1 <- tibble(
  date = seq.Date(
    from = ymd('2019-01-01'),
    to = ymd('2019-06-01'), 
    by = 'days')) %>% 
  mutate(var = rnorm(n()))

df1 %>%
  barchart(var ~ date, data = ., horiz = FALSE,
    scales = 
      list(x = 
        list(
          at = seq(1,152,7),
          labels = as.Date(unlist(df1[,'date']), origin = '1970-01-01')[seq(1,152,7)], 
          rot = 45)
        )
  )

基于此的潜在格子解决方案:Decrease number of x-axis ticks (labels) in barchart

library(dplyr)
library(lubridate)
library(lattice)

tb <- tibble(date = seq.Date(from = ymd('2019-01-01'),
                             to = ymd('2019-06-01'), 
                             by = 'days')) %>%
      mutate(var = rnorm(n())) 

dateLabs <- seq(1, nrow(tb), by=7)

scalesList <- list(x = list(rot = 45, labels = format(tb$date, "%b-%d-%Y")[dateLabs], at = dateLabs))

tb %>%
  barchart(var ~ date, 
           data = ., 
           horiz = FALSE,
           scales = scalesList)