Ошибка с ggplot facet_wrap: Ошибка: `scale_id` не должен быть `NA`

#r #ggplot2 #facet-wrap

#r #ggplot2 #обтекание фасета

Вопрос:

Я застрял на этом все утро, но не могу понять.

Каждая строка моих данных содержит: временные метки, измерения, пользователя.

Если я отображаю свои данные в целом, все работает нормально. Но если я пытаюсь отобразить данные по дате с помощью facet_wrap, он продолжает терпеть неудачу с ошибкой: Ошибка: scale_id не должно быть NA .

Ответ может быть совершенно очевидным, но мне не хватает знаний и ключевых слов, чтобы найти ответ самостоятельно.

Я привел простейший пример, который выдает ошибку ниже.

Любой ввод / совет с благодарностью.

Reprex:

 library(tidyverse)

cols <- cols(
  timestamp = col_datetime(format = ""),
  tps = col_double(),
  user = col_character()
)

df <- read_csv("
timestamp,              tps,    user  
2021-01-06 07:05:44,    10,    CatA
2021-01-06 09:05:44,    15,    CatA
2021-01-06 10:15:44,    10,    CatA
2021-01-06 14:05:44,    15,    CatA
2021-01-06 07:03:44,    11,    CatB
2021-01-06 09:01:44,    13,    CatB
2021-01-06 10:12:44,    2,     CatB
2021-01-06 16:05:44,    6,     CatB
2021-01-07 07:05:44,    2,     CatA
2021-01-07 09:05:44,    3,     CatA
2021-01-07 10:15:44,    6,     CatA
2021-01-07 14:05:44,    7,     CatA
2021-01-07 07:03:44,    9,     CatB
2021-01-07 09:01:44,    6,     CatB
2021-01-07 10:12:44,    4,     CatB
2021-01-07 16:05:44,    1,     CatB
", col_types = cols)

str(df)


#  tibble [16 x 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
#   $ timestamp: POSIXct[1:16], format: "2021-01-06 07:05:44" "2021-01-06 09:05:44" "2021-01-06 10:15:44" "2021-01-06 14:05:44" ...
#   $ tps      : num [1:16] 10 15 10 15 11 13 2 6 2 3 ...
#   $ user     : chr [1:16] "CatA" "CatA" "CatA" "CatA" ...
#   - attr(*, "spec")=
#    .. cols(
#    ..   timestamp = col_datetime(format = ""),
#    ..   tps = col_double(),
#    ..   user = col_character()
#    .. ) 


#I then create a date variable:

df <- df %>%
  mutate(date = floor_date(
    timestamp, 
    unit = "days", 
    week_start = getOption("lubridate.week.start", 7)) 
  )


# This is where it fails: 
ggplot(data=df, aes(x=timestamp, y=tps, color=user))  
  geom_line()  
  scale_x_datetime()  
  facet_wrap( ~ date)


##########
# RESULT #
##########

#> ggplot(data=df, aes(x=timestamp, y=tps, color=user))  
#    geom_line()  
#    scale_x_datetime()  
#    facet_wrap( ~ date)
#Error: `scale_id` must not be `NA`

 

Ответ №1:

Измените date столбец на класс даты.

 library(ggplot2)

ggplot(data=df, aes(x=timestamp, y=tps, color=user))  
  geom_line()  
  scale_x_datetime()  
  facet_wrap( ~ as.Date(date), scales = 'free')
 

введите описание изображения здесь

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

1. спасибо!! Можете ли вы уточнить, почему facet_wrap( ~ date) недостаточно? Что такого в классе POSIXct, что привело к сбою facet_wrap, если он не преобразован в date ?

2. Фасеты не работают должным образом, когда переменная имеет тип Posixct. Здесь сообщается о проблеме, связанной с этим github.com/tidyverse/ggplot2/issues/4175