├── README.md ├── Rplot.png ├── climate_multiples.R ├── climate_multiples.Rproj ├── data ├── .DS_Store ├── grids_germany_annual_hot_days_1951.asc ├── grids_germany_annual_hot_days_1952.asc ├── grids_germany_annual_hot_days_1953.asc ├── grids_germany_annual_hot_days_1954.asc ├── grids_germany_annual_hot_days_1955.asc ├── grids_germany_annual_hot_days_1956.asc ├── grids_germany_annual_hot_days_1957.asc ├── grids_germany_annual_hot_days_1958.asc ├── grids_germany_annual_hot_days_1959.asc ├── grids_germany_annual_hot_days_1960.asc ├── grids_germany_annual_hot_days_1961.asc ├── grids_germany_annual_hot_days_1962.asc ├── grids_germany_annual_hot_days_1963.asc ├── grids_germany_annual_hot_days_1964.asc ├── grids_germany_annual_hot_days_1965.asc ├── grids_germany_annual_hot_days_1966.asc ├── grids_germany_annual_hot_days_1967.asc ├── grids_germany_annual_hot_days_1968.asc ├── grids_germany_annual_hot_days_1969.asc ├── grids_germany_annual_hot_days_1970.asc ├── grids_germany_annual_hot_days_1971.asc ├── grids_germany_annual_hot_days_1972.asc ├── grids_germany_annual_hot_days_1973.asc ├── grids_germany_annual_hot_days_1974.asc ├── grids_germany_annual_hot_days_1975.asc ├── grids_germany_annual_hot_days_1976.asc ├── grids_germany_annual_hot_days_1977.asc ├── grids_germany_annual_hot_days_1978.asc ├── grids_germany_annual_hot_days_1979.asc ├── grids_germany_annual_hot_days_1980.asc ├── grids_germany_annual_hot_days_1981.asc ├── grids_germany_annual_hot_days_1982.asc ├── grids_germany_annual_hot_days_1983.asc ├── grids_germany_annual_hot_days_1984.asc ├── grids_germany_annual_hot_days_1985.asc ├── grids_germany_annual_hot_days_1986.asc ├── grids_germany_annual_hot_days_1987.asc ├── grids_germany_annual_hot_days_1988.asc ├── grids_germany_annual_hot_days_1989.asc ├── grids_germany_annual_hot_days_1990.asc ├── grids_germany_annual_hot_days_1991.asc ├── grids_germany_annual_hot_days_1992.asc ├── grids_germany_annual_hot_days_1993.asc ├── grids_germany_annual_hot_days_1994.asc ├── grids_germany_annual_hot_days_1995.asc ├── grids_germany_annual_hot_days_1996.asc ├── grids_germany_annual_hot_days_1997.asc ├── grids_germany_annual_hot_days_1998.asc ├── grids_germany_annual_hot_days_1999.asc ├── grids_germany_annual_hot_days_2000.asc ├── grids_germany_annual_hot_days_2001.asc ├── grids_germany_annual_hot_days_2002.asc ├── grids_germany_annual_hot_days_2003.asc ├── grids_germany_annual_hot_days_2004.asc ├── grids_germany_annual_hot_days_2005.asc ├── grids_germany_annual_hot_days_2006.asc ├── grids_germany_annual_hot_days_2007.asc ├── grids_germany_annual_hot_days_2008.asc ├── grids_germany_annual_hot_days_2009.asc ├── grids_germany_annual_hot_days_2010.asc ├── grids_germany_annual_hot_days_2011.asc ├── grids_germany_annual_hot_days_2012.asc ├── grids_germany_annual_hot_days_2013.asc ├── grids_germany_annual_hot_days_2014.asc ├── grids_germany_annual_hot_days_2015.asc ├── grids_germany_annual_hot_days_2016.asc ├── grids_germany_annual_hot_days_2017.asc ├── grids_germany_annual_hot_days_2018.asc ├── grids_germany_annual_hot_days_2019.asc ├── grids_germany_annual_hot_days_2020.asc └── grids_germany_annual_hot_days_2021.asc ├── germany_heating_up.png └── vg2500 ├── vg2500_krs.cpg ├── vg2500_krs.dbf ├── vg2500_krs.prj ├── vg2500_krs.shp ├── vg2500_krs.shx ├── vg2500_lan.cpg ├── vg2500_lan.dbf ├── vg2500_lan.prj ├── vg2500_lan.shp ├── vg2500_lan.shx ├── vg2500_rbz.cpg ├── vg2500_rbz.dbf ├── vg2500_rbz.prj ├── vg2500_rbz.shp ├── vg2500_rbz.shx ├── vg2500_sta.cpg ├── vg2500_sta.dbf ├── vg2500_sta.prj ├── vg2500_sta.shp └── vg2500_sta.shx /README.md: -------------------------------------------------------------------------------- 1 | # Small spatial multiples with R 2 | 3 | ![Germany is heating up](germany_heating_up.png) -------------------------------------------------------------------------------- /Rplot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/Rplot.png -------------------------------------------------------------------------------- /climate_multiples.R: -------------------------------------------------------------------------------- 1 | library(tidyverse) 2 | library(glue) 3 | library(terra) 4 | library(sf) 5 | library(scico) 6 | library(hrbrthemes) 7 | library(classInt) 8 | # create folder to store data in project 9 | dir.create("data") 10 | 11 | # we have data for the following years: 12 | years <- 1951L:2021L 13 | 14 | # ... and start download it: 15 | walk(years, function(year){ 16 | download.file( 17 | glue("https://opendata.dwd.de/climate_environment/CDC/grids_germany/annual/hot_days/grids_germany_annual_hot_days_{year}_17.asc.gz"), 18 | destfile = glue("data/grids_germany_annual_hot_days_{year}.asc.gz") 19 | ) 20 | R.utils::gunzip(glue("data/grids_germany_annual_hot_days_{year}.asc.gz"), remove=TRUE) 21 | }) 22 | 23 | # list all raster 24 | hot_raster <- list.files(path = "data/", full.names = TRUE) 25 | 26 | # and read them via terra: 27 | hot_raster <- rast(hot_raster) 28 | names(hot_raster) <- years 29 | 30 | # read in counties 31 | # source of shapefile: https://gdz.bkg.bund.de/index.php/default/digitale-geodaten/verwaltungsgebiete/verwaltungsgebiete-1-2-500-000-stand-01-01-vg2500.html 32 | counties <- st_read("vg2500/vg2500_krs.shp") 33 | counties_vect <- vect(counties) 34 | 35 | # reproject to bring the data into the same space 36 | dwd_crs <- "epsg:31467" 37 | crs(hot_raster) <- dwd_crs 38 | hot_raster <- terra::project(hot_raster, dwd_crs) 39 | 40 | crs(counties_vect) <- dwd_crs 41 | counties_vect <- terra::project(counties_vect, dwd_crs) 42 | 43 | # extract raster values for each into the county polygon 44 | hot_counties <- terra::extract(hot_raster, 45 | counties_vect, 46 | mean, 47 | na.rm=TRUE) 48 | 49 | # make our data tidy and pivot to long 50 | names(hot_counties) <- c("ARS", years) 51 | hot_counties$ARS <- counties_vect$ARS 52 | 53 | hot_counties_long <- hot_counties %>% 54 | pivot_longer(!ARS, names_to = "Year", values_to = "n_days") %>% 55 | mutate(n_days = replace_na(n_days, 0)) 56 | 57 | # classify the data - if you change the data to another country 58 | # this step definitely needs some fine-tuning 59 | hot_classes <- classIntervals(hot_counties_long$n_days, 60 | n=8, 61 | style="fixed", 62 | fixedBreaks=c(-1, 1, 5, 10, 15, 20, 25, 30, 100)) 63 | hot_counties_long$classes <- cut(hot_counties_long$n_days, hot_classes$brks) 64 | 65 | # and finally, 66 | counties_long <- left_join(hot_counties_long, counties, by = c("ARS")) 67 | 68 | legend_labels <- c("0 - 1", "2-5", "6-10", "11-15", "16-20", "21-25", "26-30", ">31") 69 | 70 | counties_long %>% 71 | st_as_sf() %>% 72 | ggplot() + 73 | geom_sf(aes(fill = classes), 74 | size = 0.01) + 75 | scale_fill_viridis_d(labels= legend_labels, 76 | option = "F", 77 | direction = -1, 78 | begin = .17, 79 | end = .97, 80 | na.value = "#F9DFCCFF") + 81 | facet_wrap(Year ~ ., 82 | ncol = 11) + 83 | labs(title = "Germany's heating-up", 84 | #subtitle = "The hottest counties in Germany since 1951. We calculated from a raster source all", 85 | fill = "Number of days above 30°C", 86 | caption = "Data: BKK & DWD | Visualisation: Marco Sciaini") + 87 | guides(fill = guide_legend(keyheight = unit(1, units = "mm"), 88 | keywidth = unit(3, units = "mm"), 89 | direction = "horizontal", 90 | nrow = 1, 91 | ticks.colour = "white", 92 | label.position = "bottom", 93 | title.position = "bottom", 94 | title.hjust = 0.5)) + 95 | theme_void() + 96 | theme(legend.direction="horizontal", 97 | legend.position="bottom", 98 | legend.box = "vertical", 99 | text=element_text(family="West"), 100 | panel.spacing.y = unit(1, "lines"), 101 | plot.title = element_text(size = 26, 102 | face = "bold", 103 | colour = '#181c20', 104 | margin = margin(.3,0,.5,0, "cm")), 105 | strip.background =element_rect(fill= alpha('#cd5c5c', 0.05), colour = NA), 106 | strip.text = element_text(size = 7, 107 | face = "bold", 108 | colour = '#181c20', 109 | margin = margin(.1,0,.1,0, "cm")), 110 | plot.caption = element_text(size = 7, 111 | colour = '#181c20', 112 | margin = margin(.3,0,.3,0, "cm"))) 113 | 114 | 115 | ggsave("germany_heating_up.png", dpi = 300, width = 2000, height = 2400, units = "px") 116 | -------------------------------------------------------------------------------- /climate_multiples.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/data/.DS_Store -------------------------------------------------------------------------------- /germany_heating_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/germany_heating_up.png -------------------------------------------------------------------------------- /vg2500/vg2500_krs.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /vg2500/vg2500_krs.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_krs.dbf -------------------------------------------------------------------------------- /vg2500/vg2500_krs.prj: -------------------------------------------------------------------------------- 1 | PROJCS["DHDN_3_Degree_Gauss_Zone_3",GEOGCS["GCS_Deutsches_Hauptdreiecksnetz",DATUM["D_Deutsches_Hauptdreiecksnetz",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",3500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",31467]] -------------------------------------------------------------------------------- /vg2500/vg2500_krs.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_krs.shp -------------------------------------------------------------------------------- /vg2500/vg2500_krs.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_krs.shx -------------------------------------------------------------------------------- /vg2500/vg2500_lan.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /vg2500/vg2500_lan.dbf: -------------------------------------------------------------------------------- 1 | y 2 | AOBJIDCBEGINNDADENARSC GENC<BEZCKIBZNBEMCKARS_0C DEBKGVG3000000BP20210401 201 Schleswig-Holstein Land 20-- 010000000000 DEBKGVG3000000BQ20210401 202 Hamburg Freie und Hansestadt 22-- 020000000000 DEBKGVG3000000BR20210401 203 Niedersachsen Land 20-- 030000000000 DEBKGVG3000000BS20210401 204 Bremen Freie Hansestadt 23-- 040000000000 DEBKGVG3000000BT20210401 205 Nordrhein-Westfalen Land 20-- 050000000000 DEBKGVG3000000BU20210401 206 Hessen Land 20-- 060000000000 DEBKGVG3000000BV20210401 207 Rheinland-Pfalz Land 20-- 070000000000 DEBKGVG3000000BW20210401 208 Baden-Württemberg Land 20-- 080000000000 DEBKGVG3000000BX20210401 209 Bayern Freistaat 21-- 090000000000 DEBKGVG3000000BY20210401 210 Saarland Land 20-- 100000000000 DEBKGVG3000000BZ20210401 211 Berlin Land 20-- 110000000000 DEBKGVG3000000C020210401 212 Brandenburg Land 20-- 120000000000 DEBKGVG3000000C120210401 213 Mecklenburg-Vorpommern Land 20-- 130000000000 DEBKGVG3000000C220210401 214 Sachsen Freistaat 21-- 140000000000 DEBKGVG3000000C320210401 215 Sachsen-Anhalt Land 20-- 150000000000 DEBKGVG3000000C420210401 216 Thüringen Freistaat 21-- 160000000000 -------------------------------------------------------------------------------- /vg2500/vg2500_lan.prj: -------------------------------------------------------------------------------- 1 | PROJCS["DHDN_3_Degree_Gauss_Zone_3",GEOGCS["GCS_Deutsches_Hauptdreiecksnetz",DATUM["D_Deutsches_Hauptdreiecksnetz",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",3500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",31467]] -------------------------------------------------------------------------------- /vg2500/vg2500_lan.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_lan.shp -------------------------------------------------------------------------------- /vg2500/vg2500_lan.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_lan.shx -------------------------------------------------------------------------------- /vg2500/vg2500_rbz.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /vg2500/vg2500_rbz.dbf: -------------------------------------------------------------------------------- 1 | y 2 | AOBJIDCBEGINNDADENARSC GENC<BEZCKIBZNBEMCKARS_0C DEBKGVG3000000B620210401 3051 Düsseldorf Regierungsbezirk 30-- 051000000000 DEBKGVG3000000B720210401 3053 Köln Regierungsbezirk 30-- 053000000000 DEBKGVG3000000B820210401 3055 Münster Regierungsbezirk 30-- 055000000000 DEBKGVG3000000B920210401 3057 Detmold Regierungsbezirk 30-- 057000000000 DEBKGVG3000000BA20210401 3059 Arnsberg Regierungsbezirk 30-- 059000000000 DEBKGVG3000000BB20210401 3064 Darmstadt Regierungsbezirk 30-- 064000000000 DEBKGVG3000000BC20210401 3065 Gießen Regierungsbezirk 30-- 065000000000 DEBKGVG3000000BD20210401 3066 Kassel Regierungsbezirk 30-- 066000000000 DEBKGVG3000000BE20210401 3081 Stuttgart Regierungsbezirk 30-- 081000000000 DEBKGVG3000000BF20210401 3082 Karlsruhe Regierungsbezirk 30-- 082000000000 DEBKGVG3000000BG20210401 3083 Freiburg Regierungsbezirk 30-- 083000000000 DEBKGVG3000000BH20210401 3084 Tübingen Regierungsbezirk 30-- 084000000000 DEBKGVG3000000BI20210401 3091 Oberbayern Regierungsbezirk 30-- 091000000000 DEBKGVG3000000BJ20210401 3092 Niederbayern Regierungsbezirk 30-- 092000000000 DEBKGVG3000000BK20210401 3093 Oberpfalz Regierungsbezirk 30-- 093000000000 DEBKGVG3000000BL20210401 3094 Oberfranken Regierungsbezirk 30-- 094000000000 DEBKGVG3000000BM20210401 3095 Mittelfranken Regierungsbezirk 30-- 095000000000 DEBKGVG3000000BN20210401 3096 Unterfranken Regierungsbezirk 30-- 096000000000 DEBKGVG3000000BO20210401 3097 Schwaben Regierungsbezirk 30-- 097000000000 -------------------------------------------------------------------------------- /vg2500/vg2500_rbz.prj: -------------------------------------------------------------------------------- 1 | PROJCS["DHDN_3_Degree_Gauss_Zone_3",GEOGCS["GCS_Deutsches_Hauptdreiecksnetz",DATUM["D_Deutsches_Hauptdreiecksnetz",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",3500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",31467]] -------------------------------------------------------------------------------- /vg2500/vg2500_rbz.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_rbz.shp -------------------------------------------------------------------------------- /vg2500/vg2500_rbz.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_rbz.shx -------------------------------------------------------------------------------- /vg2500/vg2500_sta.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /vg2500/vg2500_sta.dbf: -------------------------------------------------------------------------------- 1 | y 2 | AOBJIDCBEGINNDADENARSC GENC<BEZCKIBZNBEMCKARS_0C DEBKGVG3000000C520210401 1000000000000Deutschland Bundesrepublik 10-- 000000000000 DEBKGVG3000000C720210401 1000000000000Deutschland Bundesrepublik 10-- 000000000000 DEBKGVG3000000C620210401 0-- Bodensee -- 0-- --  -------------------------------------------------------------------------------- /vg2500/vg2500_sta.prj: -------------------------------------------------------------------------------- 1 | PROJCS["DHDN_3_Degree_Gauss_Zone_3",GEOGCS["GCS_Deutsches_Hauptdreiecksnetz",DATUM["D_Deutsches_Hauptdreiecksnetz",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",3500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",31467]] -------------------------------------------------------------------------------- /vg2500/vg2500_sta.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_sta.shp -------------------------------------------------------------------------------- /vg2500/vg2500_sta.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcosci/climate_multiples/042cb1d8bd4866d144aca2cf2ff011ae862d57a7/vg2500/vg2500_sta.shx --------------------------------------------------------------------------------