Сообщение об ошибке при создании ggplot с полосами спада - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть набор данных, который отображает безработицу с течением времени, и я хочу добавить полосы, выделяющие при рецессии.

Исходный кадр данных называется квартальными данными.

recession <- data.frame(date_start= as_date(c("1973-07-01", "1980-01-01", "1990-07-01","2008-04-01")),
                        date_end = as_date(c("1975-07-01","1981-04-01", "1991-07-01","2009-04-01")))

recession$date_start <- ymd (recession$date_start)
recession$date_end <- ymd (recession$date_end)


ggplot(quarterly_data, aes(x=date, y= Unemployment))+
  geom_line()+
  geom_rect(data = recession, inherit.aes=FALSE , aes(xmin = date_start, xmax = date_end, ymin = -0.1, ymax = 0.1),
            fill = "red", alpha= 0.3)

Однако, когда я запускаю ggplot, я получаю это сообщение об ошибке:

Error: Invalid input: time_trans works with objects of class POSIXct only

Кто-нибудь знает, как это исправить?

1 Ответ

1 голос
/ 28 апреля 2020

Хотя вы предоставили нам фрейм данных recession, вы не предоставили нам фрейм данных quarterly_data, в котором вы получаете сообщение об ошибке. Несколько указателей здесь, чтобы попробовать, но сначала, немного описания того, что измерить, вызывает эту проблему.

Прежде всего, time_trans , кажется, из пакета весов , но не ясно, почему это должно выполняться на основе кода выше. Есть ли что-нибудь еще, что могло бы использовать пакет scales здесь?

Теперь для самого сообщения об ошибке требуется только объект класса POSIXct. Это отличается от объектов класса Date, которые создаются из используемого вами пакета lubridate, что очевидно из использования as_date для создания фрейма данных recession.

You Вы можете подтвердить это самостоятельно, запустив class(recession$date_start), и вы увидите, что на выходе получается объект класса Date.

После функции ymd() вы также получаете объект класса Date. Из документации вы должны иметь возможность принудительно преобразовать класс для преобразования в POSIXct POSIXt, указав аргумент tz= (часовой пояс). Вы можете увидеть это следующим образом:

> class(ymd(recession$date_start))
[1] "Date"

> class(ymd(recession$date_start, tz='GMT'))
[1] "POSIXct" "POSIXt" 

Итак, это может решить вашу проблему. Но у вас все еще есть какая-то детективная работа, так как у нас нет вашего другого фрейма данных, и мы, очевидно, не видим функцию, которая пытается вызвать time_trans из пакета scales. Другая возможность здесь заключается в том, что ggplot вызывает это для настройки оси на основе объекта POSIXt ... но я не вижу вызова scale_ или coord_flip(), который мог бы вызвать эту ошибку. Я бы порекомендовал следующую последовательность:

  • Попробуйте подход "homerun", снова запустив функции ymd(), но предоставив tz="GMT", чтобы вывод был объектом POSIXct. Не уверен, что это будет успешно.

  • запустите саму строку ggplot(). Вы получаете ту же ошибку? Если это так, ошибка находится внутри фрейма данных quarterly_data, а не фрейма данных recession. Если это работает, запустите строку ggplot() и добавьте объект geom_line(). Если это все еще работает, то ваша проблема связана с функцией geom_rect, которая, вероятно, означает фрейм данных recession.

  • Проверьте класс объектов даты в quarterly_data. Они Date класс или POSIXct класс? Если Date, попробуйте преобразовать их в POSIXct (возможно, просто используйте as.POSIXct()).

  • Есть ли еще код, который принадлежит здесь из вашего вызова сюжета? Если у вас есть coord_flip() или какие-либо scale_x или другие тематические c элементы, которые добавлены в ваш код графика, они, безусловно, могут попытаться настроить шкалу времени и привести к этой ошибке.

...