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

时间:2019-06-13 19:57:36

标签: r lattice

考虑这个简单的例子

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)

enter image description here

很显然,x轴被弄乱了。标签太多了!如何减少日期刻度的数量?

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

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解决方案。

谢谢!

2 个答案:

答案 0 :(得分:2)

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))

要使用点阵,首先将您的小节存储为对象,使用seq()设置间隔(at),然后使用as.Date()设置labels和使用相同的seq()为date列建立索引。

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)
        )
  )

enter image description here

答案 1 :(得分:1)

基于此的潜在晶格解: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)