install.packages(c("sf", "spData", "terra"))
Week 5 Tutorial
Learning Objectives
In this tutorial, you will be using data about the Australia Election. You will be learning how to:
- Work with map data in R
- Visualise map data in R
- Modify map projections
Before your tutorial
- Installing relevant R-packages
- Get the distribution of preferences by candidate by division for the 2022 Australian Federal Election
Follow these instructions to download this data:
2022 federal election
Downloads
Distribution of preferences by candidate by division
Or directly use the url here: https://results.aec.gov.au/27966/Website/Downloads/HouseDopByDivisionDownload-27966.csv
- Getting the electoral district geographical boundaries
- Go to https://www.aec.gov.au/electorates/gis/licence.htm to agree with the license
- Download the ESRI (.shp) zip file for Victoria where Federal election boundary applied in 2022.
- Look up the colours of the current political parties
- Go to https://handbook.aph.gov.au/StatisticalInformation/Parties
- Filter your results to Victoria and for the most recent parliament elected
- Run the following code if you use Mac. This is to help speed up the spatial visualisation.
# For speeding up geom_sf
if (!identical(getOption("bitmapType"), "cairo") && isTRUE(capabilities()[["cairo"]])) {
options(bitmapType = "cairo")
}
Exercise 5A
Download, combine and wrangle the election data so it is ready for mapping!.
We will need this for exercise part 5B.
- Load the packages you need
library(tidyverse)
library(sf)
- Import the election data
Note here we show you an example how you can directly download the data from a url instead of saving the data and reading it from a .csv
= "https://results.aec.gov.au/27966/Website/Downloads/HouseDopByDivisionDownload-27966.csv"
url
<- read_csv(url,
election_data skip = 1
)
Use the help menu ?read_csv
to remind yourself why we set skip=1
.
- Wrangle your data so we only keep the winners from the election.
We will also use string manipulation to change the division names be in capital letters.
= election_data |>
election_data # Select winning candidate only
filter(CalculationType == "Preference Count" &
== "Y" &
Elected == 0) |>
CountNumber # make division name upper case so
# it can be joined later with map data
mutate(DivisionNm = toupper(DivisionNm))
Again look a the help menu to see examples of how ?toupper
works.
- Read the map data using the code below. Note we do not use
read_csv
here. We need to useread_sf
as this is a map.
= "data/vic-july-2021-esri/E_VIC21_region.shp"
vic_map_path <- read_sf(here::here(vic_map_path)) |>
vic_election_map # to match up with election data
mutate(DivisionNm = toupper(Elect_div)) |>
::st_simplify(dTolerance = 100) sf
Why might I want st_simplify
? Read about it using the help menu and suitable values for setting dTolerance
.
- Combine the election data with the election boundaries.
= vic_election_map |>
vic_election_map left_join(election_data, by = "DivisionNm")
You can refresh how to combine to data sets together by reviewing the tidyverse cheat sheet.
- Determine an appropriate colour for the political parties. We will need these to colour code our map.
How many and which political parties do we need colours for?
|>
election_data filter(StateAb == "VIC") |>
select(PartyAb) |>
distinct(PartyAb)
# A tibble: 5 × 1
PartyAb
<chr>
1 LP
2 ALP
3 NP
4 IND
5 GVIC
Using the parliamentary handbook, we can match the political party with their associated colour.
<- c(
party_colors "ALP" = "#DE3533",
"GVIC" = "#10C25B",
"IND" = "#000000",
"LP" = "#0047AB",
"NP" = "#FFFF00"
)
You can change these if you’d like to. Many of the inner city independents used the teal colour.
Exercise 5B
Draw a map of Victoria and colour the electorate districts with the political party that won that district in the 2022 federal election.
- Draw a map that looks like below.
To do this we need to use mapping functions that work with ggplot2
.
The function
geom_sf
is used to define the aesthetics of how to plot the map.The function
coord_sf
is used to define the coordinate range of the plot.
Hint 1
|>
vic_election_map ggplot() +
geom_sf(aes(geometry = ???, fill = ???), color = "black")
Hint 2
|>
vic_election_map ggplot() +
geom_sf(aes(geometry = geometry, fill = PartyAb), color = "black") +
coord_sf(xlim = c(???, ???), ylim = c(???, ???)) +
Solution
|>
vic_election_map ggplot() +
geom_sf(aes(geometry = geometry, fill = PartyAb),
color = "white"
+
) coord_sf(xlim = c(144.8, 145.2), ylim = c(-38.1, -37.6)) +
scale_fill_manual(values = party_colors) +
ggtitle("Winners of Australian Federal Election in 2021",
subtitle = "Victoria"
)
- Modify the map drawn in a. so that the legend only shows the parties shown in the visualisation.
You may find the function st_crop
useful here.
Hint 3
|>
vic_election_map st_crop(xmin = ???, xmax = ???,
ymin = ???, ymax = ???)
- Finally add the text labels of the name of the electoral division for Melbourne, Menzies and Macnamara, like below.
The function geom_sf_label
can be used to add labels to a map.
Hint 4
= vic_election_map %>%
vic_map_subset filter(Elect_div %in% c("Melbourne", "Menzies", "Macnamara"))
|>
vic_election_map ggplot() +
geom_sf(aes(geometry = geometry), color = "black") +
geom_sf_label(data = vic_map_subset, aes(label = ???, geometry = ???))
Exercise 5C: In your own time
Learn to modify the map projection The world is not flat. Let’s learn how to deal with that in the mapping world.
Load the world map data contained in spData
.
library(spData)
data(world, package = "spData")
- Plot the map data
world
usingggplot2
.
- Mollweide projection is a map projection that preserves area relationships. Apply this projection by setting
crs = "+proj=moll"
in thest_transform
function and visualise the result.
- Modify the projection so that it transforms the coordinates to the Lambert azimuthal equal-area projection with Australia in the center (25.27°S, 133.78°E).
Stuck on where to start:
## Look at the last example in the help
?geom_sf
Exercise 5D: In your own time
Repeat exercises 5A and 5B above but for all of Australia.
There will be a few things you should watch our for:
The increase in map size will make reading the files and plotting the data much slower compared to Victoria. So be sure to use
st_simplify()
.You may also encounter an odd error with this map where you need to use
st_valid()
to redraw the polygons correctly.For the whole of Australia there may be other parties for which we have yet to download the colours.
There may also be some small differences in how the Division are named. You may need to handle some edge cases.