Шкала сдвига по оси X даты с непостоянной последовательностью времени в R - PullRequest
0 голосов
/ 05 мая 2019

У меня есть данные временных рядов за 2000-2018 годы, с января по декабрь каждого года.Я хочу перекрыть линии средних значений temp_mean за период 2000-2016 и наблюдаемого temp_mean 2017-2018.

Я мог бы сделать это с помощью очень ручного кода, однако я понимаю, что это можно сделать очень простым способом с помощью пакетов, доступных сегодня для управления датами на графиках (пакеты "scale", "lubridate" и т. Д..)

Может ли кто-нибудь помочь мне упростить мою работу для составления сюжета?Я действительно ценю это.

suppressWarnings(suppressMessages(library("tidyverse", quietly = T)))

dat <- tibble(
  date = seq(as.Date("2010-01-01"), as.Date("2018-12-31"), by=1),
  tmean = rgamma(length(date), shape=2, scale=2)) %>%
  mutate(year = lubridate::year(date),
         month = lubridate::month(date),
         julian = lubridate::yday(date))

# calculate daily average temperature for the serie 2010-2016
dat_serie <- dat %>%
  filter(year<2017) %>%
  group_by(julian) %>%
  summarise(
    month = first(month),
    avg = mean(tmean, .2, na.rm = T)) %>%
  ungroup()


p0 <- dat_serie %>%
  filter(month %in% c("1", "2", "3", "9","10", "11", "12")) %>%
  mutate(julian_AWS = ifelse(julian>=244, julian-243, julian+123)) %>%
  ggplot() +
  geom_line(aes(julian_AWS, avg, color = factor(month)))+

  scale_x_continuous(breaks = c(1,#S
                                31,#O
                                61,#N
                                91,#D
                                121,#E
                                151,#F
                                181),#M
                     labels = c("Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar"))+
  theme(axis.text.x=element_text(hjust=-1))

Моя главная задача - как сопоставить значения серии и 2017-2018 гг. По оси X для наложения значений y.С некоторой помощью от здесь я добавил строку 2017-2018:

dat_17_18 <-  dat %>% 
filter(date >= '2017-09-01', date < '2018-03-30') %>% 
mutate(julian_AWS = ifelse(julian>=244, julian-243, julian+123)) 

p0 + geom_line(data = dat_17_18,
            aes(julian_AWS, tmean, linetype = factor(year)))

Создано в 2019-05-05 пользователем представительный пакет (v0.2.1)

1 Ответ

2 голосов
/ 05 мая 2019

Ты очень близко. Если я правильно понимаю, вы можете присоединить ваши агрегированные данные к данным за 2017–2018 годы и продолжать использовать даты из вашего исходного набора данных

dat_17_18 <-
  dat %>%
  filter(date >= '2017-09-01', date < '2018-03-30') %>%
  left_join(dat_serie, by = c("juian", "month"))

ggplot(dat_17_18, aes(x = date)) +
  geom_line(aes(y = avg, color = factor(month))) +
  geom_line(aes(y = tmean, linetype = factor(year))) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  theme(axis.text.x = element_text(hjust = -1))

Кроме того, поскольку мы находимся в кишечнике этого графика, иметь основу для диаграммы области может быть легче для чтения, чем для 2 зубчатых линий. enter image description here

ggplot(dat_17_18, aes(x = date)) +
  geom_area(
    aes(y = avg, fill = factor(month)), 
    show.legend = FALSE, alpha = 0.5
  ) +
  geom_line(aes(y = tmean, linetype = factor(year))) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  theme(axis.text.x = element_text(hjust = -1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...