Попытка отобразить значение для geom_vline, но не в правильном месте на оси x с ggplot в R - PullRequest
4 голосов
/ 29 февраля 2020

В настоящее время я пытаюсь сгенерировать диаграммы прогнозирования приливов NOAA (x = datetime, y = уровень воды) с временами рассвета / восхода / сумерек / заката в виде вертикальных линий вдоль временной оси x.

Пакет rnoaa вызывает данные и выдает мне время прогнозирования в POSIXct. Солнечная библиотека c предоставляет мне фрейм данных с каждой датой в диапазоне: восход, закат и т. Д. c. в формате POSIXct.

library(rnoaa)
library(tidyverse)
library(ggplot2)
library(suncalc)
march.tides <- as.data.frame(coops_search(station_name = 8551762, 
                                          begin_date = 20200301, end_date = 20200331, 
                                          datum = "mtl", product = "predictions"))
march.tides <- march.tides %>%
  mutate(yyyy.mm.dd = as.Date(predictions.t))
dates <- unique(march.tides$yyyy.mm.dd)
sunlight.times <- getSunlightTimes(date = seq.Date(as.Date("2020/3/1"), as.Date("2020/3/31"), by = 1), 
                lat = 39.5817, lon = -75.5883, tz = "EST")

Затем у меня есть al oop, который выплевывает отдельные графики на каждую календарную дату - что работает непросто. Вертикальные линии рисуют на графике без ошибок, но, безусловно, находятся в неправильном месте (восход солнца рисуется около 11:00, когда это должно быть 06:30).

for (i in seq_along(dates)) {
  plot <- ggplot(subset(march.tides, march.tides$yyyy.mm.dd==dates[i])) +
    aes(x = predictions.t, y = predictions.v) +
    geom_line(size = 1L, colour = "#0c4c8a") +
    theme_bw() + 
    geom_vline(xintercept = sunlight.times$sunrise) +
    geom_vline(xintercept = sunlight.times$sunset) +
    geom_vline(xintercept = sunlight.times$dawn, linetype="dotted") +
    geom_vline(xintercept = sunlight.times$dusk, linetype="dotted") +
    ggtitle(dates[i])
  print(plot)
}

В качестве альтернативы я мог бы выделить даты вместо этого цикла цикла. Даже когда я помещаю данные в одну дату, вертикальные линии все равно не отображаются правильно.

Интересно, может быть, проблема в часовом поясе? Если я пытаюсь вставить аргумент часового пояса в вызов данных прогнозирования прилива, я получаю сообщение об ошибке:

Error in if (!repeated && grepl("%[[:xdigit:]]{2}", URL, useBytes = TRUE)) return(URL) : 
  missing value where TRUE/FALSE needed

1 Ответ

2 голосов
/ 29 февраля 2020

Похоже, вы хотите использовать EST в качестве часового пояса, так что вы можете включить в ваше преобразование predictions.t.

Я бы точно указал, что вы хотите пометить на своем xaxis в ggplot используя scale_x_datetime, включая часовой пояс.

library(rnoaa)
library(tidyverse)
library(ggplot2)
library(suncalc)
library(scales)

march.tides <- as.data.frame(coops_search(station_name = 8551762, 
                                          begin_date = 20200301, end_date = 20200331, 
                                          datum = "mtl", product = "predictions"))

march.tides <- march.tides %>%
  mutate(yyyy.mm.dd = as.Date(predictions.t, tz = "EST"))
dates <- unique(march.tides$yyyy.mm.dd)
sunlight.times <- getSunlightTimes(date = seq.Date(as.Date("2020/3/1"), as.Date("2020/3/31"), by = 1), 
                                   lat = 39.5817, lon = -75.5883, tz = "EST")

for (i in seq_along(dates)) {
  plot <- ggplot(subset(march.tides, march.tides$yyyy.mm.dd==dates[i])) +
    aes(x = predictions.t, y = predictions.v) +
    geom_line(size = 1L, colour = "#0c4c8a") +
    theme_bw() + 
    geom_vline(xintercept = sunlight.times$sunrise) +
    geom_vline(xintercept = sunlight.times$sunset) +
    geom_vline(xintercept = sunlight.times$dawn, linetype="dotted") +
    geom_vline(xintercept = sunlight.times$dusk, linetype="dotted") +
    ggtitle(dates[i]) +
    scale_x_datetime(labels = date_format("%b %d %H:%M", tz = "EST"))
  print(plot)
}

Участок

tide plot with xaxis date scale with timezone

...