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

  1. Installing relevant R-packages
install.packages(c("sf", "spData", "terra"))
  1. Get the distribution of preferences by candidate by division for the 2022 Australian Federal Election

Follow these instructions to download this data:

Or directly use the url here: https://results.aec.gov.au/27966/Website/Downloads/HouseDopByDivisionDownload-27966.csv

  1. Getting the electoral district geographical boundaries
  2. Look up the colours of the current political parties
  1. 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.

  1. Load the packages you need
library(tidyverse)
library(sf)
  1. 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
url = "https://results.aec.gov.au/27966/Website/Downloads/HouseDopByDivisionDownload-27966.csv"

election_data <- read_csv(url,
  skip = 1
) 

Use the help menu ?read_csv to remind yourself why we set skip=1.

  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" &
    Elected == "Y" &
    CountNumber == 0) |>
  # 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.

  1. Read the map data using the code below. Note we do not use read_csv here. We need to use read_sf as this is a map.
vic_map_path = "data/vic-july-2021-esri/E_VIC21_region.shp" 
vic_election_map <- read_sf(here::here(vic_map_path)) |>
  # to match up with election data
  mutate(DivisionNm = toupper(Elect_div)) |>
  sf::st_simplify(dTolerance = 100)

Why might I want st_simplify? Read about it using the help menu and suitable values for setting dTolerance.

  1. 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.

  1. 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.

party_colors <- c(
  "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.

  1. 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"
  )


  1. 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 = ???)
  1. 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_map_subset = vic_election_map %>% 
      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")
  1. Plot the map data world using ggplot2.

  1. Mollweide projection is a map projection that preserves area relationships. Apply this projection by settingcrs = "+proj=moll" in the st_transform function and visualise the result.

  1. 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.