class: center, middle, inverse, title-slide .title[ # Introduction to Geospatial Techniques for Social Scientists in R ] .subtitle[ ## Mapping ] .author[ ### Stefan Jünger & Anne-Kathrin Stroppe ] .institute[ ###
GESIS Workshop
] .date[ ### June 06, 2022 ] --- layout: true --- ## Now <table class="table" style="margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Day </th> <th style="text-align:left;"> Time </th> <th style="text-align:left;"> Title </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 10:00-11:30 </td> <td style="text-align:left;font-weight: bold;"> Introduction to GIS </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 11:45-13:00 </td> <td style="text-align:left;font-weight: bold;"> Vector Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 13:00-14:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> April 23 </td> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> 14:00-15:30 </td> <td style="text-align:left;font-weight: bold;background-color: yellow !important;"> Mapping </td> </tr> <tr> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> April 23 </td> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> 15:45-17:00 </td> <td style="text-align:left;font-weight: bold;border-bottom: 1px solid"> Raster Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 09:00-10:30 </td> <td style="text-align:left;font-weight: bold;"> Advanced Data Import & Processing </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 10:45-12:00 </td> <td style="text-align:left;font-weight: bold;"> Applied Data Wrangling & Linking </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 12:00-13:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 13:00-14:30 </td> <td style="text-align:left;font-weight: bold;"> Investigating Spatial Autocorrelation </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 14:45-16:00 </td> <td style="text-align:left;font-weight: bold;"> Spatial Econometrics & Outlook </td> </tr> </tbody> </table> --- ## Fun With Flags... MAPS! .center[ <img src="data:image/png;base64,#../img/fun_with_flags.jpg" width="90%" style="display: block; margin: auto;" /> ] <br> .center[ <small><small><small> Fun with Flags by Dr. Sheldon Cooper. [Big Bang Theory](https://youtu.be/_e8PGPrPlwA)</small></small></small> ] --- ## Fun with maps .pull-left[ `plot()` does not allow us to manipulate the maps in an easy. But we already have the two most essential ingredients to create a nice map: 1. Vector data stored in the `./data` folder 2. Some (hopefully) interesting attributes linked with the geometries. ] .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/attributed-cologne-1.png" style="display: block; margin: auto;" /> ] --- ## Cologne data ```r attributed_cologne <- sf::read_sf("./data/attributed_cologne.shp") charger_cologne <- sf::read_sf("./data/charger_cologne.shp") streets_cologne <- sf::read_sf("./data/streets_cologne.shp") ``` --- ## What makes a good map? <br> .pull-left[ **Good Mapping** - reduction to most important information - legends, scales, descriptions - audience oriented - adjusted for color vision deficiencies ] -- .pull-right[ **Bad Mapping** - overcrowding and overlapping - unreadable information - missing information like the legend or source - poor choice of color palettes ] --- ## What makes a good map? .pull-left[ .center[![](data:image/png;base64,#https://media.giphy.com/media/C9x8gX02SnMIoAClXa/giphy-downsized-large.gif)] .tinyisher[.center[[Source](https://media.giphy.com/media/C9x8gX02SnMIoAClXa/giphy-downsized-large.gif)]] ] .pull-right[ ... but there is one other type: .center[ **The fast but nice map.** ] - fast exploration of spatial data by visualizing the geometries and attributes - might not be publication-ready yet, but they are more rewarding than just plotting information. ] --- ## The choice is Yours: `R` Packages for Mapping <br> <br> As always, `R` offers several ways to map spatial data, and the provided packages are various. What is out there? Just a few: - base R graphics package: [`mapdata`](https://rpubs.com/rbatzing/mapping) - mobile-friendly interactive maps: [`leaflet`](https://rstudio.github.io/leaflet/) - interactive and static thematic maps based on shapefiles: - [`tmap`](https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html) - [`mapview`](https://r-spatial.github.io/mapview/) --- ## Our Choice Today Today, we'll concentrate on the package [`tmap`](https://cran.r-project.org/web/packages/tmap/index.html) - very intuitive and makes "good" decisions for us - the syntax is very similar to [`ggplot2`](https://cran.r-project.org/web/packages/ggplot2/index.html)* <img src="data:image/png;base64,#../img/68747470733a2f2f6d74656e6e656b65732e6769746875622e696f2f646f776e6c6f6164732f696d616765732f636c61737369632e706e67.png" width="50%" style="display: block; margin: auto;" /> .tinyisher[.center[[Source](https://www.researchgate.net/figure/Classic-world-map-consisting-of-gridded-elevation-data-rivers-country-borders-and_fig7_324652152)]] .footnote[*A wide-known 'secret' is that `tmap` creates a map based on `ggplot2`, so `ggplot2`-specific graphics manipulations will work as well.] --- ## First Map: Cologne Electric Car Data .pull-left[ ```r library(tmap) tm_shape(attributed_cologne) + tm_fill("ecar") ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/first-map-exec-1.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell .pull-left[ There is not much to consider when using `tmap` but two essential requirements: 1. Define your spatial object. 2. Choose a building block to determine how to display information. ] -- .pull-right[ ```r # define and introduce every (new) # geospatial data object tm_shape() + # choose at least one building block as # 'aesthetic layer' # for polygon layer choose from: tm_fill() + # polygons without borders tm_polygons() + # polygons with borders tm_borders() + # only borders of polygons # for line layer choose: tm_lines() + # for point layer choose: tm_dots() + tm_bubbles() + # for raster layer choose tm_raster() + tm_rgb() + ... # for all of them: ?'tmap-element' ``` ] --- ## `tmap` In a Nutshell: Polygon Layer .pull-left[ ```r tm_shape(attributed_cologne) + tm_fill() tm_shape(attributed_cologne) + tm_polygons() tm_shape(attributed_cologne) + tm_borders() ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-1.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-2.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-3.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell: Line and Point Layer .pull-left[ ```r tm_shape(streets_cologne) + tm_lines() tm_shape(charger_cologne) + tm_dots() ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/line-layer-1.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/line-layer-2.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell: Put It All Together We can map the geometric attributes as single layers, but we can also layer our map and stack the layers on each other. -- .pull-left[ ```r tm_shape(attributed_cologne) + tm_polygons() + tm_shape(streets_cologne) + tm_lines() + tm_shape(charger_cologne) + tm_dots(col = "red") ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/over-lay-1.png" style="display: block; margin: auto;" /> ] --- ## Add Some Information <br> <br> After we took care of our geometric types, we want to add some information to our data. The inner construction of each building block of `tm_elements` is the same. 1. Define the variable of interest first by stating the column name. 2. Add a name for the legend title and color palette, adjust the legend and scales ... --- ## Choosing an Attribute .pull-left[ ```r tm_shape(attributed_cologne) + tm_polygons("ecar") ``` ] -- .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/life-exp-1.png" style="display: block; margin: auto;" /> ] ] --- ## Choosing a Color Palette .pull-left[ ```r tm_shape(attributed_cologne) + tm_polygons( "ecar", palette = "RdPu", title = "Electric Cars", style = "kmeans" ) ``` ] -- .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/add-attributes-1.png" style="display: block; margin: auto;" /> ] ] --- ## Re-Placing the Legend .pull-left[ ```r tm_shape(attributed_cologne) + tm_polygons( "ecar", palette = "RdPu", title = "Electric Car", style = "kmeans" ) + tm_layout( legend.outside = TRUE ) ``` ] .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/add-attributes-legend-1.png" style="display: block; margin: auto;" /> ] ] --- ## Compasses & Scale Bars .pull-left[ ```r tm_shape(attributed_cologne) + tm_polygons("ecar") + tm_scale_bar() + tm_compass() ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/compass-scalebar-I-1.png" style="display: block; margin: auto;" /> ] -- .pull-right[ ```r tm_shape(attributed_cologne) + tm_polygons("ecar") + tm_scale_bar(position = "left") + tm_compass(type = "4star") ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/compass-scalebar-II-1.png" style="display: block; margin: auto;" /> ] --- class: middle ## Exercise 1_3_1: Basic Maps [Exercise](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/exercises/1_3_1_Basic_Maps.html) [Solution](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/solutions/1_3_1_Basic_Maps.html) --- ## What's Left? <br> .center[ <img src="data:image/png;base64,#../img/enough_maps.jpg" width="70%" style="display: block; margin: auto;" /> ] --- ## Getting Interactive (as an Alternative To `mapview::mapview()`)! .pull-left[ ```r ecar_map <- tm_shape(attributed_cologne) + tm_borders(col = "black") + tm_polygons("ecar") tmap_mode("view") ecar_map ``` ] .pull-right[
] --- ## Facets I ```r tm_shape(attributed_cologne) + tm_polygons(c("cdu", "spd", "greens", "afd", "left", "fdp")) + tm_facets( ncol = 3) ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/facets-disp-I-1.png" width="55%" style="display: block; margin: auto;" /> --- ## Facets II ```r attributed_cologne %>% dplyr::mutate(city_area = as.integer(substr(id, 1, 1))) %>% tm_shape(.) + tm_polygons(c("ecar")) + tm_facets(by = "city_area", nrow = 2) + tm_layout(panel.labels = c("1 Innenstadt","2 Rodenkirchen","3 Lindenthal", "4 Ehrenfeld", "5 Nippes","6 Chorweiler", "7 Porz", "8 Kalk", "9 Mülheim")) ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/facets-disp-II-disp-1.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- ## Change Style ```r tm_shape(attributed_cologne) + tm_polygons("ecar") + tm_style("classic") ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/styles-1.png" width="55%" style="display: block; margin: auto;" /> ```r # other available styles are: "beaver", "bw", "watercolor" , # "white", "gray", "natural", "cobalt", "col_blind", "albatross", ``` --- ## Color Vision Deficiencies: Standard Palette <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/color-def-1.png" width="55%" style="display: block; margin: auto;" /> .tinyisher[Created with the package [`colorBlindness`](https://cran.r-project.org/web/packages/colorBlindness/index.html)] --- ## Color Vision Deficiencies: `Viridis` Palette <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/color-def-virdis-1.png" width="55%" style="display: block; margin: auto;" /> .tinyisher[Created with the package [`colorBlindness`](https://cran.r-project.org/web/packages/colorBlindness/index.html)] --- ## Animation `tm_animate` allows you to create animated maps and visualize changes in spatial data, e.g. over time or attributes. You can customize the animation's duration, frame rate, timeline sliders, and transition effects. .pull-left[ ```r vote_gif <- attributed_cologne %>% tidyr::pivot_longer(., cols = c("cdu", "spd", "greens", "afd", "left", "fdp"), # Select all columns to pivot names_to = "party_id", # New column name for party identifier values_to = "voteshare") # New column name for vote shares %>% tm_shape(.) + tm_polygons(c("voteshare")) + tm_facets(along = "party_id") tmap_animation(vote_gif, filename = "./content/img/vote_gif.gif", delay=150) ``` ] .pull-right[ <img src="data:image/png;base64,#../img/vote_gif.gif" width="70%" style="display: block; margin: auto;" /> ] --- ## Save Maps `tmap` offers support for various output formats, including: - Static Images: PNG, JPEG, TIFF, etc. - Interactive Web Maps: HTML, JavaScript (using packages like leaflet). - Animated Maps: GIF, MP4, etc. You can also control width and height, dpi, etc. ```r # save regular map tmap_save(ecar_map, filename = "ecar_map.png") # save as interactive map tmap_save(ecar_map, filename = "ecar_map.html" ) ``` --- # Note On Mapping Responsible .pull-left[ **In the best cases**, maps are easy to understand and an excellent way to transport (scientific) messages. ] .pull-right[ **In the worst cases**, they simplify (spurious) correlations and draw a dramatic picture of the world. ] **Maps can shape narratives** - Decisions on which projection you use (remember the `true size` projector?), - the segment of the world you choose, - and the colors and styles you add have a strong influence. Example: [Kenneth Field's blog post](https://www.esri.com/arcgis-blog/products/product/mapping/mapping-coronavirus-responsibly/) --- ## More Resources <br> If you want to dive deeper into mapping with `tmap` check out: - Introduction by [Thomas Lo Russo](https://tlorusso.github.io/geodata_workshop/tmap_package) - Blogpost by [Hollie Zevross](http://zevross.com/blog/2018/10/02/creating-beautiful-demographic-maps-in-r-with-the-tidycensus-and-tmap-packages/) And if you want to get some inspiration, keep an eye out for the `#30DayMapChallenge` on Twitter. Repository of Last Year's Challenge [here](https://github.com/tjukanovt/30DayMapChallenge). --- class: middle ## Exercise 1_3_2: Fun with Maps [Exercise](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/exercises/1_3_2_Fun_with_Maps.html) [Solution](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/solutions/1_3_2_Fun_with_Maps.html) --- class: middle ## Add-on Slides: TMap Examples --- ## Map Examples: E-Mobility Instead of placing maps next to each other, we can also explore spatial correlations by adding layers. Another benefit of layering: We can make our map more realistic and aesthetic. For example, we can add a background layer of neighboring countries, a layer of German cities, or the German states' borders for orientation. Each layer can visualize another attribute of our map. For today, we want to add a layer of charging stations to the electric car map. --- ## E-Mobility and Charging Stations .pull-left[ ```r # map e-car share ecar_map <- tm_shape(german_districts_enhanced) + tm_polygons(col = "ecar_share", title = "Electric Car Share", palette = "viridis", n=10, style = "jenks" ) + tm_layout(main.title = "Electric Cars in Germany", main.title.color = "black" ) + tm_legend(legend.outside = TRUE, legend.outside.position = "left") ecar_map ``` ] .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/ecar-map-1.png" style="display: block; margin: auto;" /> ] --- ## E-Mobility and Charging Stations .pull-left[ ```r # map the charging stations on the e-car map ecar_chargers_map <- tm_shape(german_districts_enhanced) + tm_polygons(col = "ecar_share", title = "Electric Car Share", palette = "viridis", n = 10, style = "jenks" ) + tm_layout(main.title = "Electric Cars in Germany", main.title.color = "black" ) + tm_legend(legend.outside = TRUE, legend.outside.position = "left") + # Add charging point data tm_shape(chargers_sf) + tm_dots("power_kw", col = "lightgrey", alpha = 0.1, title.size = "Power of Charging Station (kW)") ecar_chargers_map ``` ] .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/charger-map-1.png" style="display: block; margin: auto;" /> ] --- ## German Federal Election 2021 <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/btw-21_map-1.png" style="display: block; margin: auto;" /> --- ## The Corresponding Code .small[ Stroppe, A.-K., & Jungmann, N. (2022). Stadt, Land, Wahl: Welchen Einfluss hat der Wohnort auf die Wahlentscheidung bei der Bundestagswahl 2021? easy_social_sciences, 67, 49-60. https://doi.org/10.15464/easy.2022.07 ] ```r # With Credits to Nils Jungmann ## District Shapefile german_districts <- # load data sf::read_sf("./data/VG250_KRS.shp") %>% # transform to correct crs sf::st_transform(crs = 3035) %>% # subsetting land area of Germany dplyr::filter(GF == 4) %>% # only keep necessary cols dplyr::select(AGS,geometry) ## BL Shapefile german_states <- sf::read_sf("./data/VG250_LAN.shp") %>% # transform to correct crs sf::st_transform(crs = 3035) %>% # subsetting land area of Germany dplyr::filter(GF == 4) %>% # only keep necessary cols dplyr::select(AGS,geometry) ## German Federal Election Results 21 ### Abfrage bundeswahlleiter, 28.02.22 ### Wahlergebnisse nach kreisfreien Städten und Landkeisen ### https://www.bundeswahlleiter.de/bundestagswahlen/2021/ergebnisse/weitere-ergebnisse.html btw21_krs <- # load data read.csv2("./data/btw2021kreis_zweitstimme.csv", header= T, fill = T, sep= ";", dec = ",", colClasses=c("character","character",rep("numeric",44)), encoding = "UTF-8", strip.white = TRUE) %>% # correct name first col dplyr::rename(., AGS = 1) %>% # compute vote shares dplyr::mutate( AGS = stringr::str_pad(.$AGS, 5, pad = "0"), turnout = ((Ungültige + Gültige)/Wahlberechtigte) *100, union_shr = ((CDU + CSU) / Gültige) * 100, afd_shr = (AfD / Gültige) * 100, fdp_shr = (FDP / Gültige) * 100, spd_shr = (SPD / Gültige) * 100, linke_shr = (DIE.LINKE / Gültige) * 100, green_shr = (GRÜNE / Gültige) * 100, sonstige_shr = (rowSums(.[14:46])/Gültige) * 100) %>% # select necessary vars dplyr::select(AGS,turnout, ends_with(c("_shr"))) %>% # remove mean over all districts dplyr::filter(. , AGS != "00000") %>% # aggregate east and west berlin dplyr::mutate(. , AGS = ifelse(AGS == "11100" | AGS == "11200", "11000", AGS)) %>% dplyr::group_by(AGS) %>% dplyr::summarise(across(everything(), list(mean))) %>% dplyr::rename_with(~stringr::str_remove(., '_1')) ## correct for district that was reformed in 2022 btw21_krs <- btw21_krs %>% dplyr::filter(., AGS == "16063") %>% dplyr::mutate( AGS = "16056") %>% dplyr::bind_rows(btw21_krs,.) ## join election results to shapefile german_districts_btw <- german_districts %>% dplyr::left_join(. , btw21_krs, by = "AGS") # Prepare for mapping: Dataset for each party plus color union <- german_districts_btw %>% dplyr::select(union_shr, geometry) %>% dplyr::mutate(party = "Union", color = "#030303") %>% dplyr::rename(party_shr = union_shr) spd <- german_districts_btw %>% dplyr::select(spd_shr, geometry) %>% dplyr::mutate(party = "SPD", color = "#FF0000") %>% dplyr::rename(party_shr = spd_shr) fdp <- german_districts_btw %>% dplyr::select(fdp_shr, geometry) %>% dplyr::mutate(party = "FDP", color = "#FFFF00") %>% dplyr::rename(party_shr = fdp_shr) gruene <- german_districts_btw %>% dplyr::select(green_shr, geometry) %>% dplyr::mutate(party = "Gruene", color = "#66CD00") %>% dplyr::rename(party_shr = green_shr) linke <- german_districts_btw %>% dplyr::select(linke_shr, geometry) %>% dplyr::mutate(party = "Linke", color = "#8A2BE2") %>% dplyr::rename(party_shr =linke_shr) afd <- german_districts_btw %>% dplyr::select(afd_shr, geometry) %>% dplyr::mutate(party = "AfD", color = "#1E90FF") %>% dplyr::rename(party_shr = afd_shr) # bind the datasets party_shares <- rbind(union, spd, fdp, gruene, linke, afd) # plot ## nested dataset by_party <- party_shares %>% dplyr::group_by(party, color) %>% tidyr::nest() ## add list of party colors for figures party_colors <- c("#030303", "#FF0000", "#FFFF00", "#66CD00", "#8A2BE2", "#1E90FF") # custom party color palettes parties <- c("Union", "SPD", "FDP", "GRÜNE", "LINKE", "AfD") party_palette_fcts <- purrr::map(party_colors, ~ colorRampPalette(c("#FFFFFF",.x))) names(party_palette_fcts) <- paste0(parties,"_palette") union_palette <- party_palette_fcts[[1]](10) spd_palette <- party_palette_fcts[[2]](10) fdp_palette <- party_palette_fcts[[3]](10) gruene_palette <- party_palette_fcts[[4]](10) linke_palette <- party_palette_fcts[[5]](10) afd_palette <- party_palette_fcts[[6]](10) # labels for vote shares vs_labels <- c("0 bis 5", "5 bis 10", "10 bis 15", "15 bis 20", "20 bis 25", "25 bis 30", "30 bis 35", "35 bis 40", "40 bis 45", "45 bis 50") # maps # maps uni_btwshare_map <- tm_shape(subset(party_shares, party == "Union")) + tm_polygons("party_shr", title = "CDU/CSU", palette = union_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) spd_btwshare_map <- tm_shape(subset(party_shares, party == "SPD")) + tm_polygons("party_shr", title = "SPD", palette = spd_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) fdp_btwshare_map <- tm_shape(subset(party_shares, party == "FDP")) + tm_polygons("party_shr", title = "FDP", palette = fdp_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) gru_btwshare_map <- tm_shape(subset(party_shares, party == "Gruene")) + tm_polygons("party_shr", title = "Grüne", palette = gruene_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) lin_btwshare_map <- tm_shape(subset(party_shares, party == "Linke")) + tm_polygons("party_shr", title = "DIE LINKE", palette = linke_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) afd_btwshare_map <- tm_shape(subset(party_shares, party == "AfD")) + tm_polygons("party_shr", title = "AfD", palette = afd_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) # combine maps all_btwshare_map <- tmap_arrange(uni_btwshare_map, spd_btwshare_map, fdp_btwshare_map, gru_btwshare_map, lin_btwshare_map, afd_btwshare_map, ncol = 3) all_btwshare_map # tmap_save(all_btwshare_map, filename = "party_vote_shares_district_map.eps", dpi = 600) ``` --- layout: false class: center background-image: url(data:image/png;base64,#../assets/img/the_end.png) background-size: cover .left-column[ </br> <img src="data:image/png;base64,#../img/Anne.png" width="75%" style="display: block; margin: auto;" /> ] .right-column[ .left[.small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path> </svg> [anne-kathrin.stroppe@gesis.org](mailto:anne-kathrin.stroppe@gesis.org)] .small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> </svg> [`@astroppe`](https://twitter.com/stroppann)] .small[<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path> </svg> [`stroppann`](https://github.com/stroppann)] .small[<svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z"></path> </svg> [`NA`](NA)]] ]