class: monash-bg-blue center middle hide-slide-number <div class="bg-black white" style="width:45%;right:0;bottom:0;padding-left:5px;border: solid 4px white;margin: auto;"> <i class="fas fa-exclamation-circle"></i> These slides are viewed best by Chrome and occasionally need to be refreshed if elements did not load properly. See here for <a href=part2-session2.pdf>PDF <i class="fas fa-file-pdf"></i></a>. </div> <br> .white[Push the **right arrow key** to see the next slide.] --- count: false background-image: url(images/d2bg5.jpg) background-size: cover class: hide-slide-number title-slide <div class="grid-row" style="grid: 1fr / 2fr;"> .item.center[ # <span style="text-shadow: 2px 2px 30px white;">Data Visualization with R <br> Workshop Part 2</span> <!-- ## <span style="color:yellow;text-shadow: 2px 2px 30px black;">Making maps</span> --> ] .center.shade_black.animated.bounceInUp.slower[ <br><br> ## Making maps <br> Presented by Di Cook Department of Econometrics and Business Statistics <img src="images/monash-one-line-reversed.png" style="width:500px"><br>
<i class="fas fa-envelope faa-float animated "></i>
dicook@monash.edu
<i class="fab fa-twitter faa-float animated faa-fast "></i>
@statsgen .bottom_abs.width100.bg-black[ 22nd Feb 2022 | methods@manchester | Zoom ] ] </div> --- class: font_smaller # <img src="images/1920px-World_Health_Organization_Logo.svg.png" width="50px" style="vertical-align: middle;"> Tuberculosis incidence The TB data is from the [WHO]( https://www.who.int/tb/country/data/download/en/). ``` ## # A tibble: 40,800 Γ 5 ## country year age_group sex count ## <chr> <dbl> <fct> <chr> <dbl> ## 1 Afghanistan 1997 15-24 m 10 ## 2 Afghanistan 1997 25-34 m 6 ## 3 Afghanistan 1997 35-44 m 3 ## 4 Afghanistan 1997 45-54 m 5 ## 5 Afghanistan 1997 55-64 m 2 ## 6 Afghanistan 1997 65- m 0 ## 7 Afghanistan 1997 15-24 f 38 ## 8 Afghanistan 1997 25-34 f 36 ## 9 Afghanistan 1997 35-44 f 14 ## 10 Afghanistan 1997 45-54 f 8 ## # β¦ with 40,790 more rows ``` --- class: question <br><br><br><br> What is a choropleth map? -- <br> Why use a choropleth map? -- --- # How do we get a map? A polygon map of the world can be extracted from the `maps` package. .font_small[ ```r world_map <- map_data("world") world_map %>% filter(region == "Australia") %>% DT::datatable(width=1150, height=100) ```
] --- # Maps are basically groups of connected dots .left-code[ <br> <br> These are the points, defining the country boundary for Australia <br> <br> .font_small[ ```r oz <- world_map %>% filter(region == "Australia") ggplot(oz, aes(x = long, y = lat)) + geom_point() + * coord_map() ``` ] ] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-4-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots .left-code[ <br> <br> Connect the dots <br> <br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = group)) + geom_point() + * geom_line() + coord_map() ``` ] <br>
What happened?
] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-5-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots .left-code[ <br> <br> Connect the dots <br> <br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = group)) + #geom_point() + * geom_path() + coord_map() ``` ] ] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-6-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ This map doesn't have states and territory connections, and also sub-regions is not uniquely defining islands. <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = subregion)) + geom_path() + coord_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-7-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ We can also plot the map using `geom_polygon`, and fill with colour. <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, group = group)) + * geom_polygon() + coord_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-8-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ Using a .monash-orange2[map theme] makes the result look more map-like <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, group = group)) + geom_polygon() + coord_map() + * theme_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-10-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Tips for mapping .top-color-box[For data analysis, maps are a set of points, connected correctly to generate polygons.] -- .color-box[Note: It is important when converting spatial objects from a mapping software to a data analysis project is .monash-blue2["thinning" the map] to make it smaller and efficient to work with. Both the [rmapshaper](https://cran.r-project.org/web/packages/rmapshaper/index.html) package and `st_simplify` in the [sf](https://r-spatial.github.io/sf/) have tools to thin the number of points defining a polygon, while respecting the shape, and adjacent boundaries.] --- class: transition middle # Let's make a choropleth map of tuberculosis --- # Pre-process the data Aggregate counts across sex and age group for 2012 <br> .font_small[ ```r tb_2012 <- tb %>% filter(year == 2012) %>% rename(region = country) %>% group_by(region) %>% summarise(count = sum(count)) ggplot(tb_2012, aes(map_id = region)) + * geom_map(aes(fill = count), map = world_map, * color="grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long, y = world_map$lat) + scale_fill_viridis("Count") + theme_map() ``` ] --- <img src="images/day2-session2/unnamed-chunk-11-1.png" width="100%" style="display: block; margin: auto;" /> -- .corner-box[What happened to the USA? UK?] --- # Check the name matching .font_small[ ```r wm_names <- world_map %>% select(region) %>% distinct() tb_names <- tb %>% filter(year == 2012) %>% select(country) %>% distinct() *tb_miss_from_wm <- anti_join(tb_names, wm_names, * by=c("country" = "region")) *wm_miss_from_tb <- anti_join(wm_names, tb_names, * by=c("region" = "country")) ``` ] --- ```r DT::datatable(tb_miss_from_wm, width = 1150, height = 100) ```
--- ```r DT::datatable(wm_miss_from_tb, width = 1150, height = 100) ```
--- .top-color-box[Countries often have different names across data sets. Ideally one could use isocodes (e.g. AUS, AU) but this is not common practice.] -- .code-box[.font_small[ ```r tb_fixed <- tb %>% mutate(region=recode(country, "United States of America" = "USA", "United Kingdom of Great Britain and Northern Ireland" = "UK", "Russian Federation" = "Russia", "Viet Nam" = "Vietnam", "Venezuela (Bolivarian Republic of)" = "Venezuela", "Bolivia (Plurinational State of)" = "Bolivia", "Czechia" = "Czech Republic", "Iran (Islamic Republic of)" = "Iran", "Iran (Islamic Republic of)" = "Laos", "Democratic People's Republic of Korea" = "North Korea", "Republic of Korea" = "South Korea", "United Republic of Tanzania" = "Tanzania", "Congo" = "Republic of Congo")) ``` ] ] --- <br><br> π
Try again!
.font_small[ ```r *tb_2012 <- tb_fixed %>% filter(year == 2012) %>% group_by(region) %>% summarise(count = sum(count)) ggplot(tb_2012, aes(map_id = region)) + * geom_map(aes(fill = count), map = world_map, * color = "grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long, y = world_map$lat) + scale_fill_viridis("Count") + theme_map() ``` ] --- <img src="images/day2-session2/unnamed-chunk-16-1.png" width="100%" style="display: block; margin: auto;" /> --- # Counts are typically skewed .left-code[ .font_small[ ```r ggplot(tb_2012, aes(x = count)) + geom_histogram() ``` ] <br> <br> Symmetrising count, helps visual perception of a choropleth map. <br> <br> <br> .font_small[ ```r ggplot(tb_2012, aes(x = count)) + geom_histogram() + * scale_x_log10() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-17-1.png" width="60%" style="display: block; margin: auto;" /> <img src="images/day2-session2/unnamed-chunk-18-1.png" width="60%" style="display: block; margin: auto;" /> ] --- # Choropleth on log scale <br><br> .font_small[ ```r *tb_2012_map <- world_map %>% left_join(tb_2012) ggplot(tb_2012_map, aes(x = long, y = lat, group=group)) + geom_polygon(aes(fill = count), color="grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long*1.1, y = world_map$lat*1.1) + * scale_fill_viridis("Count", trans = "log10") + theme_map() ``` ] <br> <br> .corner-box[Note: `geom_polygon()` can be used instead of `geom_map()`. Also `geom_sf()` works similarly with `sf` spatial polygons. ] --- <img src="images/day2-session2/unnamed-chunk-19-1.png" width="100%" style="display: block; margin: auto;" /> --- class: transition middle # Choropleth maps can be misleading --- class: middle .info-box.pad10[The population is not likely to be uniformly distributed across space. Big spatial areas may have few individuals, and high density areas are likely to be very small spatially. Choropleth maps can mislead the reader about the distribution of the statistic relative to a population. Think about using a .blue[cartogram], which transforms the spatial polygons to represent the population whilst keeping faithful to geographic proximity.<br><br> ] -- <center> .blue["Land doesn't vote, people do"] </center> --- <!-- - Read the LGA data from `ozmaps` package. - This has LGAs for all of Australia. - Need to filter out Victoria LGAs, avoiding LGAs from other states with same name, and make the names match covid data names. This is done using a regex expression removing () state and LGA type text strings--> # COVID incidence in Victoria 2020 .pull-left[ <img src="images/day2-session2/covid-choropleth-1.png" width="100%" style="display: block; margin: auto;" /> ] <!-- - Incorporate population data to make cartogram - Population from https://www.planning.vic.gov.au/land-use-and-population-research/victoria-in-future/tab-pages/victoria-in-future-data-tables - Polygons are transformed so that area matches, as best possible, to the population --> .pull-right[ <img src="images/day2-session2/vic-cartogram-1.png" width="100%" style="display: block; margin: auto;" /> ] .corner-box[The .white[cartogram] package can be used to transform the polygons. Other alternative include hexagon binning with .white[sugarbag], and spatial facets with .white[geofacet].] --- class: transition middle # Point data overlaid on a map --- # Where are the platypi? <img src="https://upload.wikimedia.org/wikipedia/commons/7/7e/Platypus-sketch.jpg"> --- .left-code[ .font_small[ ```r load(here::here("data/platypus.rda")) p <- ggplot(platypus) + geom_point(aes(x = Longitude, y = Latitude), alpha = 0.1) p ``` <img src="images/day2-session2/unnamed-chunk-22-1.png" width="100%" style="display: block; margin: auto;" /> ] ] .right-plot[ <br> <br> .font_small[ ```r p + coord_map() ``` <img src="images/day2-session2/unnamed-chunk-23-1.png" width="100%" style="display: block; margin: auto;" /> ] ] --- # Extract Open Street Map using `ggmap` <br><br> Download and save the map, so that you don't need to do multiple downloads. <br><br> .font_small[ ```r oz_bbox <- c(112.9, # min long -45, # min lat 159, # max long -10) # max lat *oz_map <- get_map(location = oz_bbox, source = "osm") save(oz_map, file=here::here("data/oz_map.rda")) ``` ] --- # Platypus occurrences across Australia <br><br> .left-code[ .font_small[ ```r load(here::here("data/oz_map.rda")) ggmap(oz_map) + geom_point(data = platypus, aes(x = Longitude, y = Latitude), alpha = 0.1, colour = "orange") + theme_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-26-1.png" width="100%" style="display: block; margin: auto;" /> ] --- class: exercise middle hide-slide-number <i class="fas fa-users"></i> # <i class="fas fa-code"></i> Open `part2-exercise-02.Rmd` <center>
15
:
00
</center> --- # Resources These are sites with lots of useful information about making maps in R: <br> - https://www.littlemissdata.com/blog/maps - https://www.r-spatial.org/r/2018/10/25/ggplot2-sf.html - https://www.paulamoraga.com/book-geospatial/sec-spatialdataandCRS.html - https://rspatialdata.github.io - Thematic maps with [tmap](https://r-tmap.github.io/tmap/) - Spatial polygons with [sf](https://r-spatial.github.io/sf/) --- class: font_smaller background-color: #e5e5e5 # Session Information .scroll-350[ ```r devtools::session_info() ``` ``` ## β Session info βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ## setting value ## version R version 4.1.2 (2021-11-01) ## os macOS Big Sur 11.5.1 ## system aarch64, darwin20 ## ui X11 ## language (EN) ## collate en_AU.UTF-8 ## ctype en_AU.UTF-8 ## tz Australia/Melbourne ## date 2022-02-22 ## pandoc 2.16.2 @ /usr/local/bin/ (via rmarkdown) ## ## β Packages βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ## package * version date (UTC) lib source ## anicon 0.1.0 2022-02-16 [1] Github (emitanaka/anicon@0b756df) ## assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0) ## backports 1.4.1 2021-12-13 [1] CRAN (R 4.1.1) ## bit 4.0.4 2020-08-04 [1] CRAN (R 4.1.1) ## bit64 4.0.5 2020-08-30 [1] CRAN (R 4.1.0) ## bitops 1.0-7 2021-04-24 [1] CRAN (R 4.1.0) ## brio 1.1.3 2021-11-30 [1] CRAN (R 4.1.1) ## broom 0.7.12 2022-01-28 [1] CRAN (R 4.1.1) ## bslib 0.3.1 2021-10-06 [1] CRAN (R 4.1.1) ## cachem 1.0.6 2021-08-19 [1] CRAN (R 4.1.1) ## callr 3.7.0 2021-04-20 [1] CRAN (R 4.1.0) ## cartogram * 0.2.2 2020-08-26 [1] CRAN (R 4.1.0) ## cellranger 1.1.0 2016-07-27 [1] CRAN (R 4.1.0) ## class 7.3-19 2021-05-03 [1] CRAN (R 4.1.2) ## classInt 0.4-3 2020-04-07 [1] CRAN (R 4.1.0) ## cli 3.2.0 2022-02-14 [1] CRAN (R 4.1.2) ## colorspace 2.0-2 2021-06-24 [1] CRAN (R 4.1.1) ## countdown 0.3.5 2022-02-16 [1] Github (gadenbuie/countdown@a544fa4) ## crayon 1.5.0 2022-02-14 [1] CRAN (R 4.1.2) ## crosstalk 1.2.0 2021-11-04 [1] CRAN (R 4.1.1) ## data.table 1.14.2 2021-09-27 [1] CRAN (R 4.1.1) ## DBI 1.1.2 2021-12-20 [1] CRAN (R 4.1.1) ## dbplyr 2.1.1 2021-04-06 [1] CRAN (R 4.1.0) ## desc 1.4.0 2021-09-28 [1] CRAN (R 4.1.1) ## devtools 2.4.3 2021-11-30 [1] CRAN (R 4.1.1) ## digest 0.6.29 2021-12-01 [1] CRAN (R 4.1.1) ## dplyr * 1.0.8 2022-02-08 [1] CRAN (R 4.1.1) ## DT * 0.20 2021-11-15 [1] CRAN (R 4.1.1) ## e1071 1.7-9 2021-09-16 [1] CRAN (R 4.1.1) ## ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.0) ## emo 0.0.0.9000 2022-02-15 [1] Github (hadley/emo@3f03b11) ## evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0) ## fansi 1.0.2 2022-01-14 [1] CRAN (R 4.1.1) ## farver 2.1.0 2021-02-28 [1] CRAN (R 4.1.0) ## fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.0) ## forcats * 0.5.1 2021-01-27 [1] CRAN (R 4.1.1) ## fs 1.5.2 2021-12-08 [1] CRAN (R 4.1.1) ## generics 0.1.2 2022-01-31 [1] CRAN (R 4.1.1) ## ggmap * 3.0.0 2019-02-05 [1] CRAN (R 4.1.1) ## ggplot2 * 3.3.5 2021-06-25 [1] CRAN (R 4.1.1) ## ggthemes * 4.2.4 2021-01-20 [1] CRAN (R 4.1.0) ## glue 1.6.1 2022-01-22 [1] CRAN (R 4.1.1) ## gridExtra 2.3 2017-09-09 [1] CRAN (R 4.1.1) ## gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.1) ## haven 2.4.3 2021-08-04 [1] CRAN (R 4.1.1) ## here 1.0.1 2020-12-13 [1] CRAN (R 4.1.0) ## highr 0.9 2021-04-16 [1] CRAN (R 4.1.0) ## hms 1.1.1 2021-09-26 [1] CRAN (R 4.1.1) ## htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.1) ## htmlwidgets 1.5.4 2021-09-08 [1] CRAN (R 4.1.1) ## httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0) ## icon 0.1.0 2022-02-16 [1] Github (emitanaka/icon@8458546) ## jpeg 0.1-9 2021-07-24 [1] CRAN (R 4.1.0) ## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.1.0) ## jsonlite 1.7.3 2022-01-17 [1] CRAN (R 4.1.1) ## KernSmooth 2.23-20 2021-05-03 [1] CRAN (R 4.1.2) ## knitr 1.37 2021-12-16 [1] CRAN (R 4.1.1) ## labeling 0.4.2 2020-10-20 [1] CRAN (R 4.1.0) ## lattice 0.20-45 2021-09-22 [1] CRAN (R 4.1.2) ## lazyeval 0.2.2 2019-03-15 [1] CRAN (R 4.1.0) ## lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.1) ## lubridate * 1.8.0 2021-10-07 [1] CRAN (R 4.1.1) ## magrittr 2.0.2 2022-01-26 [1] CRAN (R 4.1.1) ## mapproj * 1.2.8 2022-01-12 [1] CRAN (R 4.1.1) ## maps * 3.4.0 2021-09-25 [1] CRAN (R 4.1.1) ## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.1.1) ## modelr 0.1.8 2020-05-19 [1] CRAN (R 4.1.0) ## munsell 0.5.0 2018-06-12 [1] CRAN (R 4.1.0) ## oz 1.0-21 2016-12-08 [1] CRAN (R 4.1.0) ## ozmaps * 0.4.5 2021-08-03 [1] CRAN (R 4.1.1) ## packcircles 0.3.4 2020-12-12 [1] CRAN (R 4.1.1) ## pillar 1.7.0 2022-02-01 [1] CRAN (R 4.1.1) ## pkgbuild 1.3.1 2021-12-20 [1] CRAN (R 4.1.1) ## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.0) ## pkgload 1.2.4 2021-11-30 [1] CRAN (R 4.1.1) ## plotly * 4.10.0 2021-10-09 [1] CRAN (R 4.1.1) ## plyr 1.8.6 2020-03-03 [1] CRAN (R 4.1.0) ## png 0.1-7 2013-12-03 [1] CRAN (R 4.1.0) ## prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.1.0) ## processx 3.5.2 2021-04-30 [1] CRAN (R 4.1.0) ## proxy 0.4-26 2021-06-07 [1] CRAN (R 4.1.0) ## ps 1.6.0 2021-02-28 [1] CRAN (R 4.1.0) ## purrr * 0.3.4 2020-04-17 [1] CRAN (R 4.1.0) ## R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.1) ## RColorBrewer 1.1-2 2014-12-07 [1] CRAN (R 4.1.0) ## Rcpp 1.0.8 2022-01-13 [1] CRAN (R 4.1.1) ## readr * 2.1.2 2022-01-30 [1] CRAN (R 4.1.1) ## readxl * 1.3.1 2019-03-13 [1] CRAN (R 4.1.0) ## remotes 2.4.2 2021-11-30 [1] CRAN (R 4.1.1) ## reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.1) ## RgoogleMaps 1.4.5.3 2020-02-12 [1] CRAN (R 4.1.0) ## rjson 0.2.21 2022-01-09 [1] CRAN (R 4.1.1) ## rlang 1.0.1 2022-02-03 [1] CRAN (R 4.1.1) ## rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.1) ## rprojroot 2.0.2 2020-11-15 [1] CRAN (R 4.1.0) ## rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0) ## rvest 1.0.2 2021-10-16 [1] CRAN (R 4.1.1) ## sass 0.4.0 2021-05-12 [1] CRAN (R 4.1.0) ## scales 1.1.1 2020-05-11 [1] CRAN (R 4.1.0) ## sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.1.1) ## sf * 1.0-6 2022-02-04 [1] CRAN (R 4.1.1) ## sp 1.4-6 2021-11-14 [1] CRAN (R 4.1.1) ## stringi 1.7.6 2021-11-29 [1] CRAN (R 4.1.1) ## stringr * 1.4.0 2019-02-10 [1] CRAN (R 4.1.1) ## testthat 3.1.2 2022-01-20 [1] CRAN (R 4.1.1) ## tibble * 3.1.6 2021-11-07 [1] CRAN (R 4.1.1) ## tidyr * 1.2.0 2022-02-01 [1] CRAN (R 4.1.1) ## tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.0) ## tidyverse * 1.3.1 2021-04-15 [1] CRAN (R 4.1.0) ## tzdb 0.2.0 2021-10-27 [1] CRAN (R 4.1.1) ## units 0.8-0 2022-02-05 [1] CRAN (R 4.1.1) ## usethis 2.1.5 2021-12-09 [1] CRAN (R 4.1.1) ## utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.0) ## vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.0) ## viridis * 0.6.2 2021-10-13 [1] CRAN (R 4.1.1) ## viridisLite * 0.4.0 2021-04-13 [1] CRAN (R 4.1.0) ## vroom 1.5.7 2021-11-30 [1] CRAN (R 4.1.1) ## whisker 0.4 2019-08-28 [1] CRAN (R 4.1.0) ## withr 2.4.3 2021-11-30 [1] CRAN (R 4.1.1) ## xaringan 0.22 2021-06-23 [1] CRAN (R 4.1.0) ## xaringanExtra 0.5.5 2022-02-16 [1] Github (gadenbuie/xaringanExtra@ee5092d) ## xfun 0.29 2021-12-14 [1] CRAN (R 4.1.1) ## xml2 1.3.3 2021-11-30 [1] CRAN (R 4.1.1) ## yaml 2.2.2 2022-01-25 [1] CRAN (R 4.1.1) ## ## [1] /Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/library ## ## ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ``` ] These slides are licensed under <br><center><a href="https://creativecommons.org/licenses/by-sa/3.0/au/"><img src="images/cc.svg" style="height:2em;"/><img src="images/by.svg" style="height:2em;"/><img src="images/sa.svg" style="height:2em;"/></a></center>