R: Добавить разрывы по оси X (дата) на графике временных рядов ggplot

За каждый день (две недели: 2015-01-01 - 2015-01-15), У меня есть 24 (почасовые значения) для построения графика с использованием пакета R ggplot2. Столбец даты dateChr (character format) выглядит следующим образом:

> str(Data$dateChr)
chr [1:360] "1/1/2015 2:00" "1/1/2015 3:00" "1/1/2015 4:00" "1/1/2015 5:00" 
"1/1/2015 6:00" "1/1/2015 7:00" ...

Вот код, который я использую:

ggplot() + 
geom_line(data = Data, aes(x = dateChr, y = val1, group=1), color = "red") +
geom_line(data = Data, aes(x = dateChr, y = val2, group=1), color = "blue") +
theme_bw() +
xlab("Date") + 
ylab("Value")

Сюжет выглядит так:

сюжет

x-axis выглядит ужасно Я хотел бы добавить перерывы в x-axis чтобы отображались только даты (без часов или меток времени) в 4-дневном перерыве, т. е. 2015-01-01, 2015-01-04, 2015-01-08 и т. д. Может кто-нибудь подсказать, как мне добавить такие перерывы?

2 ответа

Используя переменную символьного типа dateChrОП выбрала дискретную ось х.

scale_x_discrete() Функция может быть использована для настройки внешнего вида дискретной оси. В соответствии с help("discrete_scale"), требуется break параметр, который контролирует разрывы (и метки). Один из возможных типов ввода в break является

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

Итак, с дополнительным вызовом scale_x_discrete()

library(ggplot2)
ggplot() + 
  geom_line(data = Data, aes(x = dateChr, y = val1, group=1), color = "red") +
  geom_line(data = Data, aes(x = dateChr, y = val2, group=1), color = "blue") +
  theme_bw() +
  xlab("Date") + 
  ylab("Value") + 
  scale_x_discrete(breaks = function(x) x[seq(1, length(x), by = 4*24)])

мы получаем

который показывает перерывы и метки каждые 4 дня.


Теперь ОП запросил показывать только даты (без часов или меток времени). Это требует манипулирования dateChr но только для нанесения меток:

# define named functions for breaks
my_breaks <- function(x) x[seq(1, length(x), by = 4*24)]
library(ggplot2)
ggplot() + 
  geom_line(data = Data, aes(x = dateChr, y = val1, group=1), color = "red") +
  geom_line(data = Data, aes(x = dateChr, y = val2, group=1), color = "blue") +
  theme_bw() +
  xlab("Date") + 
  ylab("Value") + 
  scale_x_discrete(breaks = my_breaks,
                   labels = my_breaks(stringr::str_sub(Data$dateChr, 1, 10)))

Данные

К сожалению, ОП не предоставил данные для воспроизведения графика. Итак, мне пришлось создать свой собственный набор данных, который имитирует данные OP.

df1 <- data.table::fread("https://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20150101&end_date=20150114&station=8594900&time_zone=GMT&units=metric&interval=h&format=csv")
df2 <- data.table::fread("https://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20150101&end_date=20150114&station=8638999&time_zone=GMT&units=metric&interval=h&format=csv")

Data <- data.frame(dateChr = format(as.POSIXct(df1$`Date Time`), "%d/%m%/%Y %H:%M"),
                   val1 = df1$Speed, val2 = df2$Speed, stringsAsFactors = FALSE)
str(Data)
'data.frame': 336 obs. of  3 variables:
 $ dateChr: chr  "01/01/2015 00:00" "01/01/2015 01:00" "01/01/2015 02:00" "01/01/2015 03:00" ...
 $ val1   : num  1.42 0.51 0.91 2.08 1.3 1.27 2.08 2.33 1.7 1.95 ...
 $ val2   : num  1.1 0.1 2.7 3.5 4 4.1 4.1 4 3.8 4.4 ...

Старый пост, но на тот случай, если кто-нибудь еще его ищет. Как упоминалось в комментариях, было бы лучше преобразовать переменную даты в истинное поле даты, а затем использовать scale_x_date.

      library(ggplot2)
Data$dateDate <- lubridate::dmy_hm(Data$dateChr)

ggplot() + 
  geom_line(data = Data, aes(x = dateDate, y = val1, group=1), color = "red") +
  geom_line(data = Data, aes(x = dateDate, y = val2, group=1), color = "blue") +
  theme_bw() +
  scale_x_date("Date", date_breaks = "4 days") + 
  ylab("Value")
Другие вопросы по тегам