Дубликаты оси X для временного ряда с использованием facet_wrap в ggplot - PullRequest
0 голосов
/ 26 июня 2018

Я надеюсь, что у вас хороший день!Итак, у меня есть большой набор данных за двадцать лет, в котором я пытаюсь использовать аргумент facet_wrap, чтобы все это визуализировать.Вот упрощенная версия данных для устранения неполадок:

data <- data.frame(
Date = c("1993-06-09", "1993-08-16", "1993-09-13", "1993-10-11", "1993-11-08", "1994-03-06", "1994-05-20", "1994-07-12", "1994-12-06", "1994-09-07", "1995-04-04", "1995-01-07", "1995-02-06"),
Oxygen = c("15", "15.8", "15.3", "16", "16", "14.5", "14.9", "15.2", "15.7", "15", "12.6", "12.8", "13.5"),
Year = c("1993", "1993", "1993", "1993", "1993", "1994", "1994", "1994", "1994", "1994", "1995", "1995", "1995"),
Month = c("6", "8", "9", "10", "11", "3", "5", "7", "12", "9", "4", "1", "2"),
Day = c("9", "16", "13", "11", "8", "6", "20", "12", "6", "7", "4", "7", "6")
)

Вот остальная часть кода вокруг него:

data$Oxygen <- as.numeric(as.character(data$Oxygen))
data$Year <- as.numeric(as.character(data$Year))
data$Month <- as.numeric(as.character(data$Month))
data$Day <- as.numeric(as.character(data$Day))
data$Date <- as.Date(data$Date)
ggplot(data = data, aes(x=Date, y=Oxygen)) + geom_point() + geom_smooth(method = "loess", se=FALSE) + facet_wrap( ~ Year, ncol=2) + scale_x_date(date_breaks = "1 month", date_labels = "%B")  + theme(axis.text.x=element_text(angle = 90, hjust = 1)) +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))

Код создает этот график:

img

Моя проблема с осью X.Как мне изменить его, чтобы он не создавал непрерывную серию месяцев для каждого года друг за другом?Я хочу, чтобы все это соответствовало месяцам одного года и не создавало больше месяцев, как если бы каждый год был другим.

Вот как это выглядит, когда я добавляю остальные годы:

img

Он строит ось X каждого года, а не месячную стоимость одного года.

Наконец, как мне сказать ggplot, что я хочу видеть неделю или день в каждом месяце, чтобы не все точки были просто центрированы в фиксированном месте этого месяца вдоль оси x.

Спасибо, что уделили время!

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Чтобы получить постоянные месячные перерывы, вы можете создать фиктивную переменную дат, все с одним и тем же годом, с фасетом по фактическим годам.Таким образом, у вас все еще есть дата на оси абсцисс, что дает вам доступ к scale_x_date, но вы можете аккуратно разбить данные по годам.

Я выполнил очистку с помощью dplyr, как для краткости, так и для краткости.предпочтение, и сделал фиктивный столбец даты, где я изменил год на 2018, а затем преобразовал в объект даты с lubridate::ymd.

library(tidyverse)
library(lubridate)

data2 <- data %>%
  mutate_at(vars(-Date), function(x) as.numeric(as.character(x))) %>%
  mutate(Date = as.Date(Date)) %>%
  mutate(dummy_date = paste("2018", Month, Day) %>% ymd())


ggplot(data2, aes(x = dummy_date, y = Oxygen, group = Year)) +
  geom_point() +
  geom_smooth(method = loess, se = FALSE) +
  scale_x_date(date_breaks = "1 month", date_labels = "%B") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  facet_wrap(~ Year, ncol = 2)

Создано в 2018-06-25 для представительного пакета (v0.2.0).

0 голосов
/ 26 июня 2018

Опция 1: (пересчитано из комментариев) - используйте facet_wrap, чтобы отображать только соответствующее окно времени.

ggplot(data = data, aes(x=Month, y=Oxygen)) + 
  geom_point() + 
  geom_smooth(method = "loess", se=FALSE) + 
  facet_wrap( ~ Year, ncol=2, scales = 'free_x') + 
  scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
  theme(
    axis.text.x=element_text(angle = 90, hjust = 1),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.background = element_blank(),
    axis.line = element_line(colour = "black")
  )

Опция 2: используйте Month в качестве оси x:

ggplot(data = data, aes(x=Month, y=Oxygen)) + 
  geom_point() + 
  geom_smooth(method = "loess", se=FALSE) + 
  facet_wrap( ~ Year, ncol=2) + 
  scale_x_continuous(name = "Date", breaks = 1:12, labels = month.name) + 
  # scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
  theme(
    axis.text.x=element_text(angle = 90, hjust = 1),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.background = element_blank(),
    axis.line = element_line(colour = "black")
  )

Я не очень много работаю с датами, так что это хак, но, вероятно, этого достаточно, пока / пока кто-нибудь не покажет хорошее решение.

ggplot(data = data, aes(x=Month + pmin(Day/30, 1), y=Oxygen)) + 
  geom_point() + 
  geom_smooth(method = "loess", se=FALSE) + 
  facet_wrap( ~ Year, ncol=2) + 
  scale_x_continuous(name = "Date", breaks = 1:12, labels = month.name) + 
  # scale_x_date(date_breaks = "1 month", date_labels = "%B")  + 
  theme(
    axis.text.x=element_text(angle = 90, hjust = 1),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.background = element_blank(),
    axis.line = element_line(colour = "black")
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...