Problema
Queremos calcular y representar la duración del día con R en función de unas coordinadas geográficas.
Solución
library(suncalc)
library(tidyverse)
library(scales)
df <-
getSunlightTimes(
date = seq.Date(as.Date("2017-12-01"), as.Date("2018-12-31"), by = 1),
keep = c("sunrise", "sunriseEnd", "sunset", "sunsetStart"),
lat = 39.8628,
lon = 4.0273,
tz = "CET"
)
# Amanecer/ocaso
df %>%
mutate(
date = as.POSIXct(date) - 12 * 60 * 60 ,
sunrise = sunrise - date,
sunset = sunset - date,
) %>%
ggplot() +
geom_ribbon(aes(x = date, ymin = sunrise, ymax = sunset),
fill = "#FDE725FF",
alpha = .8) + # "#ffeda0"
scale_x_datetime(
breaks = seq(as.POSIXct(min(df$date)), as.POSIXct(max(df$date)), "month"),
expand = c(0, 0),
labels = date_format("%b %y"),
minor_breaks = NULL
) +
scale_y_continuous(
limits = c(0, 24),
breaks = seq(0, 24, 2),
expand = c(0, 0),
minor_breaks = NULL
) +
labs(
x = "Date",
y = "Hours",
title = sprintf(
"Sunrise and Sunset for %s\n%s ",
"Toledo (Spain)",
paste0(as.Date(range(df$date)), sep = " ", collapse = "to ")
)
) +
theme(
panel.background = element_rect(fill = "#180F3EFF"),
panel.grid = element_line(colour = "grey", linetype = "dashed")
)
df %>%
mutate(
date = as.POSIXct(date),
day_length = as.numeric(sunset - sunrise)
) %>%
ggplot(aes(x = date, y = day_length)) +
geom_area(fill = "#FDE725FF", alpha = .4) +
geom_line(color = "#525252") +
scale_x_datetime(
expand = c(0, 0),
labels = date_format("%b '%y"),
breaks = seq(as.POSIXct(min(df$date)), as.POSIXct(max(df$date)), "month"),
minor_breaks = NULL
) +
scale_y_continuous(
limits = c(0, 24),
breaks = seq(0, 24, 2),
expand = c(0, 0),
minor_breaks = NULL
) +
labs(x = "Date", y = "Hours", title = "Toledo (Spain) - Daytime duration") +
theme_bw()
Entradas relacionadas
Referencias