Deze code leest data van de site van de KNMI http://projects.knmi.nl/klimatologie/daggegevens/getdata_dag.cgi Daarna visualiseren, die temperaturen.
# download raw data
knmi_url <- 'http://projects.knmi.nl/klimatologie/daggegevens/getdata_dag.cgi'
knmi_params <- list(start = "19000101",
end = format(Sys.Date(), "%Y%m%d"),
vars = "TEMP",
stns = "260") #station 260 = De Bilt
knmi_req <- GET(knmi_url, query = knmi_params) # documentation says POST, but that doesn't work
# output:
# STN,YYYYMMDD, TG, TN, TNH, TX, TXH, T10N,T10NH
# read datafile
knmi_raw <- read_csv(content(knmi_req, as = "text"), comment = "#",
col_names = c("station", "yyyymmdd", "mean", "min", "min_h", "max", "max_h", "t10_min", "t10_min_h"))
## No encoding supplied: defaulting to UTF-8.
# cleanup raw datafile, select some vars, make date, convert to actual degrees
knmi <- knmi_raw %>% transmute( dag = as_date(as.character(yyyymmdd)), jaar = as.character(year(dag)),
doy = yday(dag),
gem = mean/10, min = min/10, min_h = min_h,
max = max/10, max_h = max_h,
t10_min = as.numeric(t10_min)/10, t10_min_h = t10_min_h,
soort_dag = case_when( max >= 30 ~ "tropische dag",
max >= 25 ~ "hete dag",
max >= 20 ~ "warme dag")
)
# animated barplot
p1 <- ggplot( knmi %>% mutate( max_temp = round(max)) %>% # vanwege de kleur moet dit even met de hand geteld worden
group_by(jaar, max_temp) %>% summarise(n = n()),
aes( x = max_temp, y = n, frame = jaar) ) +
geom_bar(aes(fill = max_temp), stat = "identity", position = "identity", width = 1) +
scale_fill_viridis(discrete = FALSE, option = "B") +
theme_minimal() + theme(legend.position = "none") +
xlab("maximum dagtemperatuur") +
ylab("aantal dagen dit jaar met deze temperatuur")
ani.options(interval = 0.25)
gganimate(p1, interval = .2, title_frame = FALSE)
Een gestapelde balkjesgrafiek
ggplot( filter(knmi, !is.na(soort_dag)), aes( x = factor(jaar))) +
geom_bar(aes(fill = factor(soort_dag,
levels = c("warme dag","hete dag","tropische dag"))),
width=1) +
scale_fill_manual(values = c("tropische dag" = "red", "hete dag" = "darkorange", "warme dag" = "gold"),
name = "soort dag") +
theme_minimal() + theme(axis.text.x=element_text(angle=60, hjust=1)) +
scale_x_discrete(breaks = seq(1900, 2020, 5)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
xlab("") + ylab("aantal van deze dagen in het gegeven jaar") +
ggtitle("Tropische, hete en warme dagen sinds 1900")
En een lijngrafiek (inclusief trend)
linedata <- knmi %>%
filter(!is.na(soort_dag), jaar < max(jaar)) %>% # remove this (incomplete) year
group_by(jaar, soort_dag) %>%
summarise(aantal = n())
ggplot(linedata, aes(x = jaar, y = aantal)) +
geom_line(aes(color = soort_dag, group = soort_dag)) +
geom_smooth(aes(color = soort_dag, group = soort_dag, alpha = .2),
fill = "lightgrey", alpha = .6, linetype = "dotted",
method = "loess") +
scale_color_manual(values = c("tropische dag" = "red", "hete dag" = "darkorange", "warme dag" = "gold"),
name = "soort dag") +
theme_minimal() + theme(axis.text.x=element_text(angle=60, hjust=1)) +
scale_x_discrete(breaks = seq(1900, 2020, 5)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
xlab("") + ylab("aantal van deze dagen in het gegeven jaar") +
ggtitle("Tropische, hete en warme dagen sinds 1900")