как правильно отформатировать ось х с переменной времени? - PullRequest
1 голос
/ 13 июня 2019

Рассмотрим этот простой пример

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 ]

2 голосов
/ 13 июня 2019

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

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 голос
/ 14 июня 2019

Потенциальное решение решетки, основанное на этом: Уменьшите количество отметок (меток) по оси x в виде диаграммы

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