项目作者: favstats

项目描述 :
Visualizing Temperature over Time in Stuttgart, Germany
高级语言: HTML
项目地址: git://github.com/favstats/temperature_viz.git
创建时间: 2018-08-31T08:51:01Z
项目社区:https://github.com/favstats/temperature_viz

开源协议:

下载


Temperature over Time in Stuttgart

This is a quick use-case of gganimate to visualize the rise of average temperature in my home town, Stuttgart, Germany.

Get Packages

  1. pacman::p_load(tidyverse, rvest, gganimate)

Get and Save Data

You can get the data from here: https://icdc.cen.uni-hamburg.de/daten/atmosphere/dwd-station.html

The German Weather Service (DWD) provides climate data for more than 70 observation stations from the measurement network in Germany. The stations provide scheduled, daily and monthly readings of temperatures, rainfall, sunshine duration, wind speed, humidity, barometric pressure and cloud cover, which are updated daily.

In this use-case, we are only interested in the temperature in Stuttgart. The available data for the observation station in Stuttgart ranges from 1953 until today.

  1. url <- "http://icdc.cen.uni-hamburg.de/las/ProductServer.do?xml=%3C%3Fxml+version%3D%221.0%22%3F%3E%3ClasRequest+href%3D%22file%3Alas.xml%22%3E%3Clink+match%3D%22%2Flasdata%2Foperations%2Foperation%5B%40ID%3D%27DBExtractRowset%27%5D%22%3E%3C%2Flink%3E%3Cproperties%3E%3Cferret%3E%3Ccomponents%3E+grw_m+antdyn_m+greendyn_m+antsmb_m+ocn_m+greensmb_m+glac_m+gia_m%3C%2Fcomponents%3E%3Cview%3Exy%3C%2Fview%3E%3C%2Fferret%3E%3C%2Fproperties%3E%3Cargs%3E%3Cconstraint+id%3D%22undefined%22+type%3D%22text%22%3E%3Cv%3EStations_Kennziffer%3C%2Fv%3E%3Cv%3E%253D%3C%2Fv%3E%3Cv%3E10738%3C%2Fv%3E%3C%2Fconstraint%3E%3Clink+match%3D%22%2Flasdata%2Fdatasets%2Fdwd_data%2Fvariables%2Favg_temp_day%22%3E%3C%2Flink%3E%3Cregion%3E%3Crange+type%3D%22t%22+low%3D%2201-Jan-1876%22+high%3D%2227-Aug-2018%22%3E%3C%2Frange%3E%3Crange+type%3D%22x%22+low%3D%220%22+high%3D%2224%22%3E%3C%2Frange%3E%3Crange+type%3D%22y%22+low%3D%2240%22+high%3D%2259%22%3E%3C%2Frange%3E%3C%2Fregion%3E%3C%2Fargs%3E%3C%2FlasRequest%3E"
  2. temp_stgt <- read_html(url) %>%
  3. rvest::html_node("table") %>% html_table()
  4. if(!dir.exists("data")) dir.create("data")
  5. temp_stgt <- temp_stgt %>%
  6. janitor::clean_names() %>%
  7. rename(avg_temp_day = luftemperatur_avg) %>%
  8. mutate(t = lubridate::ymd(t)) %>%
  9. mutate(month = lubridate::month(t)) %>%
  10. mutate(day = lubridate::yday(t)) %>%
  11. arrange(t) %>%
  12. mutate(year = lubridate::year(t)) %>%
  13. mutate(time = year) %>%
  14. group_by(year) %>%
  15. mutate(avg_temp_year_year = mean(avg_temp_day)) %>%
  16. ungroup()
  17. save(temp_stgt, file = "data/temp_stgt.Rdata")

Plot Temperature (Static)

  1. load("data/temp_stgt.Rdata")
  2. months <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
  3. temp_stgt %>%
  4. # filter(year %in% c(1960, 1970, 1980, 1990, 2000, 2010, 2018)) %>%
  5. ggplot(aes(day, avg_temp_day, color = year, group = year)) +
  6. geom_point(size = .01, alpha = .1) +
  7. geom_line(size = .01, alpha = .1) +
  8. geom_smooth(se = F, size = .01, alpha = .2) +
  9. viridis::scale_color_viridis("Year", direction = -1, discrete = F,
  10. breaks = c(1953, 1985, 2018),
  11. labels = c(1953, 1985, 2018)) +
  12. ggthemes::theme_hc() +
  13. labs(title = "Average Daily Temperature in Stuttgart (1953 - 2018)",
  14. caption = "Data: Der Deutsche Wetterdienst (DWD)",
  15. y = "Average Daily Temperature", x = "") +
  16. scale_x_continuous(breaks = seq(0, 365, length.out = 12), labels = months) +
  17. guides(colour = guide_colourbar(barwidth = 20, label.position = "bottom"))

  1. if(!dir.exists("images")) dir.create("images")
  2. ggsave(filename = "images/avg_temp_year.png", height = 6, width = 10)

Animations

Average Temperature over Time by Day

  1. temp_stgt_all <- temp_stgt %>%
  2. select(-year)
  3. p1 <- temp_stgt %>%
  4. # filter(year %in% c(1960, 1970, 1980, 1990, 2000, 2010, 2018)) %>%
  5. ggplot(aes(day, avg_temp_day, color = avg_temp_year, group = year)) +
  6. geom_smooth(data = temp_stgt_all, aes(day, avg_temp_day, group = time),
  7. color = "grey", se = F, size = .1, alpha = .1) +
  8. geom_point(size = .5, alpha = .7) +
  9. geom_line(size = .5, alpha = .7) +
  10. viridis::scale_color_viridis("Average Yearly Temperature", direction = -1, discrete = F) +
  11. geom_smooth(se = F, size = 1, alpha = .7) +
  12. ggthemes::theme_hc() +
  13. geom_text(aes(x = 340, y = 28, label = paste0("Year = ", year)), size = 3,
  14. hjust = 1, color = "black") +
  15. geom_text(aes(x = 340, y = 26,
  16. label = paste0("Avg. Temperature = ",
  17. sprintf("%.2f", round(avg_temp_year, 2)), "°C")),
  18. size = 3, color = "black", hjust = 1) +
  19. labs(title = "Average Daily Temperature in Stuttgart (1953 - 2018)",
  20. caption = "Data: Der Deutsche Wetterdienst (DWD)",
  21. y = "Average Daily Temperature", x = "") +
  22. scale_x_continuous(breaks = seq(0, 365, length.out = 12), labels = months) +
  23. guides(colour = guide_colourbar(barwidth = 20, label.position = "bottom")) +
  24. # Here comes the gganimate code
  25. transition_time(
  26. year
  27. ) +
  28. enter_fade() +
  29. exit_fade() +
  30. ease_aes('linear')
  31. magick::image_write(
  32. image = animate(p1, width = 1000, height = 600, renderer = magick_renderer(), length = 45),
  33. path = "images/daily_temp.gif"
  34. )

Average Temperature over Time by Year

  1. temp_stgt_allyear <- temp_stgt %>%
  2. filter(year != 2018) %>%
  3. group_by(year) %>%
  4. summarise(avg_temp_year = mean(avg_temp_year)) %>%
  5. mutate(time = year) %>%
  6. select(-year)
  7. p2 <- temp_stgt %>%
  8. filter(year != 2018) %>%
  9. group_by(year) %>%
  10. summarise(avg_temp_year = mean(avg_temp_year)) %>%
  11. ggplot(aes(year, avg_temp_year)) +
  12. geom_smooth(data = temp_stgt_allyear, aes(time, avg_temp_year),
  13. color = "red", se = F, size = .8) +
  14. geom_line(data = temp_stgt_allyear, aes(time, avg_temp_year),
  15. color = "black", size = .8, alpha = .6) +
  16. geom_point(data = temp_stgt_allyear, aes(time, avg_temp_year, color = avg_temp_year), size = 2.5) +
  17. geom_point(aes(color = avg_temp_year), size = 5) +
  18. ggthemes::theme_hc() +
  19. geom_text(aes(x = 1953.5, y = 10.8,
  20. label = paste0("Year = ", year)),
  21. size = 3, color = "black",
  22. hjust = 0) +
  23. geom_text(aes(x = 1953.5, y = 10.7,
  24. label = paste0("Avg. Temperature = ",
  25. sprintf("%.2f", round(avg_temp_year, 2)), "°C")),
  26. size = 3, color = "black", hjust = 0) +
  27. viridis::scale_color_viridis("Average Yearly Temperature", direction = -1, discrete = F) +
  28. labs(title = "Average Yearly Temperature in Stuttgart (1953 - 2017)",
  29. caption = "Data: Der Deutsche Wetterdienst (DWD)",
  30. y = "Average Yearly Temperature", x = "") +
  31. guides(colour = guide_colourbar(barwidth = 20, label.position = "bottom")) +
  32. # Here comes the gganimate code
  33. transition_time(
  34. year
  35. ) +
  36. enter_fade() +
  37. exit_fade() +
  38. ease_aes('linear') +
  39. ease_aes('linear')
  40. magick::image_write(
  41. image = animate(p2, width = 1000, height = 600, renderer = magick_renderer(), length = 45),
  42. path = "images/yearly_temp.gif"
  43. )

Average Temperature over Time by Year

  1. p3 <- temp_stgt %>%
  2. filter(year %in% c(1953, 1960, 1990, 2017)) %>%
  3. ggplot(aes(day, avg_temp_day, group = year, color = year)) +
  4. geom_line() +
  5. geom_segment(aes(xend = 365, yend = avg_temp_day), linetype = 2, colour = 'grey') +
  6. geom_point(size = 2) +
  7. geom_text(aes(x = 365, label = year), hjust = 0, size = 3, fontface = "bold") +
  8. coord_cartesian(clip = 'off') +
  9. ggthemes::theme_hc() +
  10. labs(title = "Average Daily Temperature in Stuttgart (1953, 1960, 1990, 2017)",
  11. caption = "Data: Der Deutsche Wetterdienst (DWD)",
  12. y = "Average Daily Temperature", x = "") +
  13. scale_x_continuous(breaks = seq(0, 365, length.out = 12), labels = months) +
  14. viridis::scale_color_viridis("Average Yearly Temperature", direction = -1, discrete = F) +
  15. guides(colour = F) +
  16. theme(title = element_text(size = 15, face = "bold"),
  17. axis.text.x = element_text(size = 14, face = "bold"),
  18. axis.text.y = element_text(size = 10, face = "italic")) +
  19. # Here comes the gganimate code
  20. transition_reveal(year, day) +
  21. enter_fade() +
  22. exit_fade() +
  23. ease_aes('linear')
  24. # create animation
  25. p3 %>% animate(
  26. nframes = 500, fps = 15, width = 1000, height = 600, detail = 3
  27. )
  28. anim_save("images/daily_temp_reveal.gif")

  1. sessionInfo()
  1. R version 3.5.0 (2018-04-23)
  2. Platform: x86_64-w64-mingw32/x64 (64-bit)
  3. Running under: Windows >= 8 x64 (build 9200)
  4. Matrix products: default
  5. locale:
  6. [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252
  7. [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
  8. [5] LC_TIME=German_Germany.1252
  9. attached base packages:
  10. [1] stats graphics grDevices utils datasets methods base
  11. other attached packages:
  12. [1] bindrcpp_0.2.2 rvest_0.3.2 xml2_1.2.0 forcats_0.3.0
  13. [5] stringr_1.3.0 dplyr_0.7.6 purrr_0.2.5 readr_1.1.1
  14. [9] tidyr_0.8.1 tibble_1.4.2 tidyverse_1.2.1 gganimate_0.9.9.9999
  15. [13] ggplot2_3.0.0
  16. loaded via a namespace (and not attached):
  17. [1] viridis_0.5.1 httr_1.3.1 jsonlite_1.5 viridisLite_0.3.0
  18. [5] transformr_0.1.0 modelr_0.1.1 assertthat_0.2.0 cellranger_1.1.0
  19. [9] progress_1.2.0 pillar_1.2.1 lattice_0.20-35 glue_1.3.0
  20. [13] digest_0.6.16 colorspace_1.4-0 plyr_1.8.4 psych_1.8.3.3
  21. [17] lpSolve_5.6.13 pkgconfig_2.0.1 devtools_1.13.5 broom_0.4.4
  22. [21] gifski_0.8.3 haven_1.1.2 magick_1.9 patchwork_0.0.1
  23. [25] scales_1.0.0 tweenr_0.1.5.9999 git2r_0.23.0 farver_1.0
  24. [29] pacman_0.4.6 withr_2.1.2 lazyeval_0.2.1 cli_1.0.0
  25. [33] mnormt_1.5-5 magrittr_1.5 crayon_1.3.4 readxl_1.1.0
  26. [37] memoise_1.1.0 nlme_3.1-137 foreign_0.8-70 class_7.3-14
  27. [41] ggthemes_4.0.0 tools_3.5.0 prettyunits_1.0.2 hms_0.4.2
  28. [45] munsell_0.5.0 compiler_3.5.0 e1071_1.6-8 rlang_0.2.2
  29. [49] classInt_0.2-3 units_0.6-0 grid_3.5.0 rstudioapi_0.7
  30. [53] labeling_0.3 gtable_0.2.0 DBI_1.0.0 curl_3.2
  31. [57] reshape2_1.4.3 R6_2.2.2 gridExtra_2.3 lubridate_1.7.4
  32. [61] knitr_1.20 bindr_0.1.1 stringi_1.1.7 parallel_3.5.0
  33. [65] Rcpp_0.12.18 sf_0.6-3 png_0.1-7 spData_0.2.8.3
  34. [69] tidyselect_0.2.4