ggplot: зачем scale_x_date нужен дополнительный элемент в date_labels?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня длинный фрейм данных, в который я включаю формат для меток по оси x. По некоторым причинам, которые трудно увидеть в небольшом примере, я хотел бы добавить год в первый перерыв и в начале каждого года.

Использование (длинного) столбца для date_labels in scale_x_date не работает, использование (исходного) столбца не показывает то, что я ожидаю.

При написании этого я нашел «решение», но я не понимаю, зачем нужен другой элемент («что-то»).

Вот мой код:

 library(tidyverse)

t <- tibble(
  day   = as.Date(
          c("2019-11-01", "2019-12-01", "2020-01-01", "2020-02-01")),
  a     = c(5           , 7           , 5           , 4           ) ,
  b     = c(6           , 6           , 4           , 6           ) ,
  label = c("%mn%Y"    , "%m"        , "%mn%Y"    , "%m"        )
) 

df <- t %>% 
  pivot_longer(c("a","b"), names_to="cat", values_to="value")
 

моя первая попытка:

 ggplot()  
  geom_bar(data = df, aes(x = day, y = value, fill = cat), stat = "identity", 
           position = position_dodge())  
  scale_x_date(breaks = "1 month", date_labels = df$label)
# error "Breaks and labels are different lengths" fair enough
 

вторая попытка:

 scale_x_date(breaks = "1 month", date_labels = t$label)
# not what I expected: %m %mn%Y %m %mn%Y
 

это работает:

 scale_x_date(breaks = "1 month", 
  date_labels = c("something", df$label[c(TRUE, FALSE)]))
 

но почему я должен вставлять «что-то»?

Комментарии:

1. Я немного смущен. У вас есть столбец для форматов дат, но обычно на графике с непрерывной осью x нет однозначного соответствия между разрывами оси x и наблюдениями в вашем фрейме данных (ваш пример не является исключением). Поэтому неясно, как вы ожидаете, что метки форматирования по строкам будут работать.

2. Я согласен, наблюдения и разрывы независимы. Я мог бы определить представления меток в отдельном векторе. Однако поведение идентично.

3. Скорее scale_x_date(breaks = "1 month", date_labels = t$label) всего, генерируется нижний левый предел, который находится в векторе, но не нанесен на график.