16 Visualise Geospatial Point Data

Hands-On Exercise for Week 8

Author

KB

Published

June 17, 2023

(First Published: Jun 10, 2023)

16.1 Learning Outcome

We will learn how to create a proportional symbol map showing the number of wins by Singapore Pools’ outlets using an R package called tmap.

16.2 Getting Started

16.2.1 Install and load the required R libraries

Install and load the the required R packages.

Show the code
pacman::p_load(sf, tmap, tidyverse)

16.2.2 Import the data

The data set use for this hands-on exercise is called SGPools_svy21. The data is in csv file format.

Figure below shows the first 15 records of SGPools_svy21.csv. It consists of seven columns. The XCOORD and YCOORD columns are the x-coordinates and y-coordinates of SingPools outlets and branches.

We wll use read_csv() function of readr package to import SGPools_svy21.csv into R as a tibble data frame called sgpools.

Show the code
sgpools <- read_csv("data/aspatial/SGPools_svy21.csv", show_col_types = F)

After importing the data file into R, it is important for us to examine if the data file has been imported correctly.

Show the code
list(sgpools) 
[[1]]
# A tibble: 306 × 7
   NAME           ADDRESS POSTCODE XCOORD YCOORD `OUTLET TYPE` `Gp1Gp2 Winnings`
   <chr>          <chr>      <dbl>  <dbl>  <dbl> <chr>                     <dbl>
 1 Livewire (Mar… 2 Bayf…    18972 30842. 29599. Branch                        5
 2 Livewire (Res… 26 Sen…    98138 26704. 26526. Branch                       11
 3 SportsBuzz (K… Lotus …   738078 20118. 44888. Branch                        0
 4 SportsBuzz (P… 1 Sele…   188306 29777. 31382. Branch                       44
 5 Prime Serango… Blk 54…   552542 32239. 39519. Branch                        0
 6 Singapore Poo… 1A Woo…   731001 21012. 46987. Branch                        3
 7 Singapore Poo… Blk 64…   370064 33990. 34356. Branch                       17
 8 Singapore Poo… Blk 88…   370088 33847. 33976. Branch                       16
 9 Singapore Poo… Blk 30…   540308 33910. 41275. Branch                       21
10 Singapore Poo… Blk 20…   560202 29246. 38943. Branch                       25
# ℹ 296 more rows
Note

The sgpools data in tibble data frame and not the common R data frame.

16.2.3 Create a sf data frame from an aspatial data frame

We convert sgpools data frame into a simple feature data frame by using st_as_sf() of sf packages.

Show the code
sgpools_sf <- st_as_sf(sgpools, 
                       coords = c("XCOORD", "YCOORD"),
                       #crs stands for coordinate reference system
                       crs= 3414)
Things to learn from the codes
  • The coords argument requires us to provide the column name of the x-coordinates first then followed by the column name of the y-coordinates.

  • The crs argument required us to provide the coordinates system in epsg format. EPSG: 3414 is Singapore SVY21 Projected Coordinate System. We can search for other country’s epsg code by refering to epsg.io.

Notice that a new column called geometry has been added into the sgpools_sf data frame.

We can display the basic information of the newly created sgpools_sf.

Show the code
list(sgpools_sf)
[[1]]
Simple feature collection with 306 features and 5 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 7844.194 ymin: 26525.7 xmax: 45176.57 ymax: 47987.13
Projected CRS: SVY21 / Singapore TM
# A tibble: 306 × 6
   NAME                         ADDRESS POSTCODE `OUTLET TYPE` `Gp1Gp2 Winnings`
 * <chr>                        <chr>      <dbl> <chr>                     <dbl>
 1 Livewire (Marina Bay Sands)  2 Bayf…    18972 Branch                        5
 2 Livewire (Resorts World Sen… 26 Sen…    98138 Branch                       11
 3 SportsBuzz (Kranji)          Lotus …   738078 Branch                        0
 4 SportsBuzz (PoMo)            1 Sele…   188306 Branch                       44
 5 Prime Serangoon North        Blk 54…   552542 Branch                        0
 6 Singapore Pools Woodlands C… 1A Woo…   731001 Branch                        3
 7 Singapore Pools 64 Circuit … Blk 64…   370064 Branch                       17
 8 Singapore Pools 88 Circuit … Blk 88…   370088 Branch                       16
 9 Singapore Pools Anchorvale … Blk 30…   540308 Branch                       21
10 Singapore Pools Ang Mo Kio … Blk 20…   560202 Branch                       25
# ℹ 296 more rows
# ℹ 1 more variable: geometry <POINT [m]>

The output shows that sgppols_sf is in point feature class. It’s epsg ID is 3414. The bbox provides information of the extend of the geospatial data.

16.3 Draw Proportional Symbol Map

To create an interactive proportional symbol map in R, the view mode of tmap will be used.

The code churn below will turn on the interactive mode of tmap.

Show the code
tmap_mode("view")

16.3.1 Plot an interactive point symbol map

Let’s plot an interactive point symbol map.

Show the code
tm_shape(sgpools_sf)+
tm_bubbles(col = "red",
           size = 1,
           border.col = "black",
           border.lwd = 1)
Branch
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

16.3.2 Let’s make the points proportional

To draw a proportional symbol map, we need to assign a numerical variable to the size visual attribute. The codes below show that the variable Gp1Gp2Winnings is assigned to size visual attribute.

Show the code
tm_shape(sgpools_sf)+
tm_bubbles(col = "red",
           size = "Gp1Gp2 Winnings",
           border.col = "black",
           border.lwd = 1)
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

16.3.3 Let’s give the points a different colour

The proportional symbol map can be further improved by using the colour visual attribute. In the codes below, OUTLET TYPE variable is used as the colour attribute variable.

Show the code
tm_shape(sgpools_sf)+
tm_bubbles(col = "OUTLET TYPE", 
          size = "Gp1Gp2 Winnings",
          border.col = "black",
          border.lwd = 1)
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

16.3.4 I have a twin brothers :)

An impressive and little-know feature of tmap’s view mode is that it also works with faceted plots. The argument sync in tm_facets() can be used in this case to produce multiple maps with synchronised zoom and pan settings.

Show the code
tm_shape(sgpools_sf) +
  tm_bubbles(col = "OUTLET TYPE", 
          size = "Gp1Gp2 Winnings",
          border.col = "black",
          border.lwd = 1) +
  tm_facets(by= "OUTLET TYPE",
            nrow = 1,
            # this line set both maps to be in sync
            sync = TRUE)
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

Before we end the session, it is wiser to switch tmap’s Viewer back to plot mode by using the code chunk below.

Show the code
tmap_mode("plot")

16.4 Reference

16.4.1 All about tmap package

16.4.2 Geospatial data wrangling

16.4.3 Data wrangling

Thats all folks!