SAMOS Day 5

Author

AJ Smit

1 Making maps in ggplot2

# Load libraries
library(tidyverse)
library(ggpubr)

# Load data
load("data/SAMOS/other_data/south_africa_coast.Rdata")
load("data/SAMOS/other_data/sa_provinces.RData")
load("data/SAMOS/other_data/rast_annual.Rdata")
load("data/SAMOS/other_data/MUR.Rdata")
load("data/SAMOS/other_data/MUR_low_res.RData")

# Choose which SST product you would like to use
# sst <- MUR_low_res |> ungroup()
# OR
sst <- MUR

# The colour palette we will use for ocean temperature
cols11 <- c("#004dcd", "#0068db", "#007ddb", "#008dcf", "#009bbc",
            "#00a7a9", "#1bb298", "#6cba8f", "#9ac290", "#bec99a")
ggplot(data = ChickWeight, aes(x = Time, y = weight)) +
  geom_point()

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_point() +
  geom_path()

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_polygon(colour = "red", fill = "grey70",
               aes(group = group)) # The land mask

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_polygon(colour = "red", fill = "grey70", aes(group = group)) +
  geom_path(data = sa_provinces, aes(group = group)) # The province borders

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_polygon(colour = "red", fill = "grey70", aes(group = group)) +
  geom_path(data = sa_provinces, aes(group = group)) + 
  coord_equal(xlim = c(15, 34), ylim = c(-36, -26), expand = 0) # Force lon/lat extent

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_tile(data = sst, aes(fill = bins)) + # The ocean temperatures
  geom_polygon(colour = "red", fill = "grey70", aes(group = group)) +
  geom_path(data = sa_provinces, aes(group = group)) +
  coord_equal(xlim = c(15, 34), ylim = c(-36, -26), expand = 0)

ggplot(data = south_africa_coast, aes(x = lon, y = lat)) +
  geom_raster(data = sst, aes(fill = bins)) +
  geom_polygon(colour = "black", fill = "grey70",
               aes(group = group), linewidth = 0.4) +
  geom_path(data = sa_provinces, aes(group = group), linewidth = 0.2) +
  scale_fill_manual("Temp. (°C)", values = cols11) + # Set the colour palette
  coord_equal(xlim = c(15, 34), ylim = c(-36, -26), expand = 0)

ggplot(data = rast_annual, aes(x = lon, y = lat)) +
  geom_tile(data = sst, aes(fill = bins)) +
  scale_fill_manual("Temp. (°C)", values = cols11) +
  geom_polygon(data = south_africa_coast,
               colour = "black", fill = "grey70",
               aes(group = group), linewidth = 0.4) +
  geom_path(data = sa_provinces, aes(group = group), linewidth = 0.2) +
  geom_tile(data = rast_annual, aes(x = lon, y = lat, fill = bins), 
            colour = "white", size = 0.1) + # The coastal temperature values
  coord_equal(xlim = c(15, 34), ylim = c(-36, -26), expand = 0)

final_map <- ggplot(data = rast_annual, aes(x = lon, y = lat)) +
  geom_tile(aes(x = lon, y = lat, fill = bins), 
            colour = "white", size = 0.1) +
  geom_raster(data = sst, aes(fill = bins)) +
  geom_polygon(data = south_africa_coast,
               colour = "black", fill = "grey70",
               aes(group = group), linewidth = 0.4) +
  geom_path(data = sa_provinces, aes(group = group), linewidth = 0.2) +
  geom_tile(aes(x = lon, y = lat, fill = bins), 
            colour = "white", size = 0.1) +
  scale_fill_manual("Temp. (°C)", values = cols11) +
  coord_equal(xlim = c(15, 34), ylim = c(-36, -26), expand = 0) +
  scale_x_continuous(position = "top") + # Put x axis labels on top of figure
  theme(axis.title = element_blank(), # Remove the axis labels
        legend.text = element_text(size = 7), # Change text size in legend
        legend.title = element_text(size = 7), # Change legend title text size
        legend.key.height = unit(0.3, "cm"), # Change size of legend
        legend.background = element_rect(colour = "white"), # Add legend background
        legend.justification = c(1, 0), # Change position of legend
        legend.position = c(0.975, 0.05) # Fine tune position of legend
        )
final_map

# Load libraries
# library(tidyverse)
library(scales)
# install.packages("ggspatial")
library(ggspatial)

# Load Africa map
load("data/SAMOS/other_data/africa_map.RData")
sa_1 <- ggplot() +
  borders(col = "black", fill = "cornsilk", linewidth = 0.2) +
  geom_tile(data = sst, aes(x = lon, y = lat, fill = bins)) +
  scale_fill_manual("Temp. (°C)", values = cols11) +
  coord_equal(xlim = c(12, 36), ylim = c(-38, -22), expand = 0)
sa_2 <- sa_1 +
  annotate(
    "text",
    label = "Atlantic\nOcean",
    x = 16.5,
    y = -34.0,
    size = 2.0,
    angle = 0,
    colour = "navy"
  ) +
  annotate(
    "text",
    label = "Indian\nOcean",
    x = 30.0,
    y = -34.0,
    size = 2.0,
    angle = 0,
    colour = "red4"
  )
sa_2

# install.packages("rnaturalearth", "rnaturalearthdata", "sf")
library(tidyverse)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)

# for the buffer to work as I expect, switch off
# the functions for spherical geometry:
sf_use_s2(FALSE)
# the full map extent:
xmin <- 12; ymin <- -36.5; xmax <- 40.5; ymax <- -10
xlim <- c(xmin, xmax); ylim <- c(ymin, ymax)

# make a bounding box for cropping:
bbox <- st_bbox(c(xmin = xmin, ymin = ymin,
  xmax = xmax, ymax = ymax))

# might be useful for zooming into a smaller region (False Bay and 
# the Cape Peninsula):
xlim_zoom <- c(17.8, 19); ylim_zoom <- c(-34.5, -33.2)
# load the countries:
safrica_countries <- ne_countries(returnclass = 'sf',
  continent = "Africa",
  country = c("South Africa", "Mozambique",
    "Namibia", "Zimbabwe", "Botswana",
    "Lesotho", "Eswatini"),
  scale = "medium")
# Run this on your PC... the output is too voluminous for here
glimpse(safrica_countries)
Rows: 7
Columns: 169
$ featurecla <chr> "Admin-0 country", "Admin-0 country", "Admin-0 country", "A…
$ scalerank  <int> 1, 1, 1, 1, 1, 1, 1
$ labelrank  <int> 3, 4, 2, 3, 3, 6, 4
$ sovereignt <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ sov_a3     <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_dif   <int> 0, 0, 0, 0, 0, 0, 0
$ level      <int> 2, 2, 2, 2, 2, 2, 2
$ type       <chr> "Sovereign country", "Sovereign country", "Sovereign countr…
$ tlc        <chr> "1", "1", "1", "1", "1", "1", "1"
$ admin      <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ adm0_a3    <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ geou_dif   <int> 0, 0, 0, 0, 0, 0, 0
$ geounit    <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ gu_a3      <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ su_dif     <int> 0, 0, 0, 0, 0, 0, 0
$ subunit    <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ su_a3      <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ brk_diff   <int> 0, 0, 0, 0, 0, 0, 0
$ name       <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ name_long  <chr> "Zimbabwe", "Kingdom of eSwatini", "South Africa", "Namibia…
$ brk_a3     <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ brk_name   <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ brk_group  <chr> NA, NA, NA, NA, NA, NA, NA
$ abbrev     <chr> "Zimb.", "eSw.", "S.Af.", "Nam.", "Moz.", "Les.", "Bwa."
$ postal     <chr> "ZW", "ES", "ZA", "NA", "MZ", "LS", "BW"
$ formal_en  <chr> "Republic of Zimbabwe", "Kingdom of eSwatini", "Republic of…
$ formal_fr  <chr> NA, NA, NA, NA, NA, NA, NA
$ name_ciawf <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ note_adm0  <chr> NA, NA, NA, NA, NA, NA, NA
$ note_brk   <chr> NA, NA, NA, NA, NA, NA, NA
$ name_sort  <chr> "Zimbabwe", "eSwatini", "South Africa", "Namibia", "Mozambi…
$ name_alt   <chr> NA, "Swaziland", NA, NA, NA, NA, NA
$ mapcolor7  <int> 1, 3, 2, 4, 4, 1, 6
$ mapcolor8  <int> 5, 6, 3, 1, 2, 5, 5
$ mapcolor9  <int> 3, 2, 4, 1, 1, 2, 7
$ mapcolor13 <int> 9, 5, 2, 7, 4, 8, 3
$ pop_est    <dbl> 14645468, 1148130, 58558270, 2494530, 30366036, 2125268, 23…
$ pop_rank   <int> 14, 12, 16, 12, 15, 12, 12
$ pop_year   <int> 2019, 2019, 2019, 2019, 2019, 2019, 2019
$ gdp_md     <int> 21440, 4471, 351431, 12366, 15291, 2376, 18340
$ gdp_year   <int> 2019, 2019, 2019, 2019, 2019, 2019, 2019
$ economy    <chr> "5. Emerging region: G20", "6. Developing region", "5. Emer…
$ income_grp <chr> "5. Low income", "4. Lower middle income", "3. Upper middle…
$ fips_10    <chr> "ZI", "WZ", "SF", "WA", "MZ", "LT", "BC"
$ iso_a2     <chr> "ZW", "SZ", "ZA", "NA", "MZ", "LS", "BW"
$ iso_a2_eh  <chr> "ZW", "SZ", "ZA", "NA", "MZ", "LS", "BW"
$ iso_a3     <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ iso_a3_eh  <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ iso_n3     <chr> "716", "748", "710", "516", "508", "426", "072"
$ iso_n3_eh  <chr> "716", "748", "710", "516", "508", "426", "072"
$ un_a3      <chr> "716", "748", "710", "516", "508", "426", "072"
$ wb_a2      <chr> "ZW", "SZ", "ZA", "NA", "MZ", "LS", "BW"
$ wb_a3      <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ woe_id     <int> 23425004, 23424993, 23424942, 23424987, 23424902, 23424880,…
$ woe_id_eh  <int> 23425004, 23424993, 23424942, 23424987, 23424902, 23424880,…
$ woe_note   <chr> "Exact WOE match as country", "Exact WOE match as country",…
$ adm0_iso   <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_diff  <chr> NA, NA, NA, NA, NA, NA, NA
$ adm0_tlc   <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_us <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_fr <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ru <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_es <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_cn <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_tw <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_in <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_np <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_pk <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_de <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_gb <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_br <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_il <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ps <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_sa <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_eg <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ma <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_pt <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ar <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_jp <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ko <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_vn <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_tr <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_id <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_pl <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_gr <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_it <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_nl <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_se <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_bd <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_ua <chr> "ZWE", "SWZ", "ZAF", "NAM", "MOZ", "LSO", "BWA"
$ adm0_a3_un <int> -99, -99, -99, -99, -99, -99, -99
$ adm0_a3_wb <int> -99, -99, -99, -99, -99, -99, -99
$ continent  <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Africa",…
$ region_un  <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Africa",…
$ subregion  <chr> "Eastern Africa", "Southern Africa", "Southern Africa", "So…
$ region_wb  <chr> "Sub-Saharan Africa", "Sub-Saharan Africa", "Sub-Saharan Af…
$ name_len   <int> 8, 8, 12, 7, 10, 7, 8
$ long_len   <int> 8, 19, 12, 7, 10, 7, 8
$ abbrev_len <int> 5, 4, 5, 4, 4, 4, 4
$ tiny       <int> -99, -99, -99, -99, -99, -99, -99
$ homepart   <int> 1, 1, 1, 1, 1, 1, 1
$ min_zoom   <dbl> 0, 0, 0, 0, 0, 0, 0
$ min_label  <dbl> 2.5, 4.0, 1.7, 3.0, 3.0, 4.0, 4.0
$ max_label  <dbl> 8.0, 9.0, 6.7, 7.5, 8.0, 9.0, 9.0
$ label_x    <dbl> 29.92544, 31.46726, 23.66573, 17.10817, 37.83789, 28.24664,…
$ label_y    <dbl> -18.91164, -26.53368, -29.70878, -20.57530, -13.94323, -29.…
$ ne_id      <dbl> 1159321441, 1159321289, 1159321431, 1159321085, 1159321073,…
$ wikidataid <chr> "Q954", "Q1050", "Q258", "Q1030", "Q1029", "Q1013", "Q963"
$ name_ar    <chr> "زيمبابوي", "إسواتيني", "جنوب أفريقيا", "ناميبيا", "موزمبيق…
$ name_bn    <chr> "জিম্বাবুয়ে", "ইসোয়াতিনি", "দক্ষিণ আফ্রিকা", "নামিবিয়া", "মোজাম্বিক", "লেসোথো", "বতসোয়ানা"…
$ name_de    <chr> "Simbabwe", "Eswatini", "Südafrika", "Namibia", "Mosambik",…
$ name_en    <chr> "Zimbabwe", "Eswatini", "South Africa", "Namibia", "Mozambi…
$ name_es    <chr> "Zimbabue", "Suazilandia", "Sudáfrica", "Namibia", "Mozambi…
$ name_fa    <chr> "زیمبابوه", "اسواتینی", "آفریقای جنوبی", "نامیبیا", "موزامب…
$ name_fr    <chr> "Zimbabwe", "Eswatini", "Afrique du Sud", "Namibie", "Mozam…
$ name_el    <chr> "Ζιμπάμπουε", "Εσουατίνι", "Νότια Αφρική", "Ναμίμπια", "Μοζ…
$ name_he    <chr> "זימבבואה", "אסוואטיני", "דרום אפריקה", "נמיביה", "מוזמביק"…
$ name_hi    <chr> "ज़िम्बाब्वे", "एस्वातीनी", "दक्षिण अफ़्रीका", "नामीबिया", "मोज़ाम्बीक", "लेसोथो", "बोत्सवाना"…
$ name_hu    <chr> "Zimbabwe", "Szváziföld", "Dél-afrikai Köztársaság", "Namíb…
$ name_id    <chr> "Zimbabwe", "Eswatini", "Afrika Selatan", "Namibia", "Mozam…
$ name_it    <chr> "Zimbabwe", "eSwatini", "Sudafrica", "Namibia", "Mozambico"…
$ name_ja    <chr> "ジンバブエ", "エスワティニ", "南アフリカ共和国", "ナミビア", "モザンビーク", "レソト", "ボツ…
$ name_ko    <chr> "짐바브웨", "에스와티니", "남아프리카 공화국", "나미비아", "모잠비크", "레소토", "보츠와나"…
$ name_nl    <chr> "Zimbabwe", "Swaziland", "Zuid-Afrika", "Namibië", "Mozambi…
$ name_pl    <chr> "Zimbabwe", "Eswatini", "Południowa Afryka", "Namibia", "Mo…
$ name_pt    <chr> "Zimbábue", "Essuatíni", "África do Sul", "Namíbia", "Moçam…
$ name_ru    <chr> "Зимбабве", "Эсватини", "ЮАР", "Намибия", "Мозамбик", "Лесо…
$ name_sv    <chr> "Zimbabwe", "Swaziland", "Sydafrika", "Namibia", "Moçambiqu…
$ name_tr    <chr> "Zimbabve", "Esvatini", "Güney Afrika Cumhuriyeti", "Namiby…
$ name_uk    <chr> "Зімбабве", "Есватіні", "Південно-Африканська Республіка", …
$ name_ur    <chr> "زمبابوے", "اسواتینی", "جنوبی افریقا", "نمیبیا", "موزمبیق",…
$ name_vi    <chr> "Zimbabwe", "Eswatini", "Cộng hòa Nam Phi", "Namibia", "Moz…
$ name_zh    <chr> "津巴布韦", "斯威士兰", "南非", "纳米比亚", "莫桑比克", "莱索托", "博茨瓦纳"…
$ name_zht   <chr> "辛巴威", "史瓦帝尼", "南非", "納米比亞", "莫三比克", "賴索托", "波札那"…
$ fclass_iso <chr> "Admin-0 country", "Admin-0 country", "Admin-0 country", "A…
$ tlc_diff   <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_tlc <chr> "Admin-0 country", "Admin-0 country", "Admin-0 country", "A…
$ fclass_us  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_fr  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ru  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_es  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_cn  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_tw  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_in  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_np  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_pk  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_de  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_gb  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_br  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_il  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ps  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_sa  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_eg  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ma  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_pt  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ar  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_jp  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ko  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_vn  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_tr  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_id  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_pl  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_gr  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_it  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_nl  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_se  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_bd  <chr> NA, NA, NA, NA, NA, NA, NA
$ fclass_ua  <chr> NA, NA, NA, NA, NA, NA, NA
$ geometry   <MULTIPOLYGON [°]> MULTIPOLYGON (((31.28789 -2..., MULTIPOLYGON (((31.94824 -2…
st_crs(safrica_countries)
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
unique(safrica_countries$formal_en)
[1] "Republic of Zimbabwe"     "Kingdom of eSwatini"     
[3] "Republic of South Africa" "Republic of Namibia"     
[5] "Republic of Mozambique"   "Kingdom of Lesotho"      
[7] "Republic of Botswana"    
safrica_countries |> 
  dplyr::filter(sovereignt == "South Africa") |> 
  select(sovereignt) |> 
  plot()

safrica_countries_new <- safrica_countries |> 
  group_by(continent) |> 
  summarise() |> 
  st_crop(bbox) |>
  st_combine()

plot(safrica_countries_new)

ggplot() +
  geom_sf(data = safrica_countries,
    colour = "indianred", fill = "beige") +
  coord_sf(xlim = xlim,
           ylim = ylim) +
  theme_bw()

buffer <- safrica_countries_new %>%
  st_buffer(0.4)

ggplot() +
  geom_sf(data = buffer, fill = "lightblue", col = "transparent") +
  geom_sf(data = safrica_countries, colour = "indianred", fill = "beige") +
  theme_minimal()

Reuse

Citation

BibTeX citation:
@online{a._j.,
  author = {A. J. , Smit and Smit, AJ},
  title = {SAMOS {Day} 5},
  url = {http://samos-r.netlify.app/SAMOS_Day_5.html},
  langid = {en}
}
For attribution, please cite this work as:
A. J. S, Smit A SAMOS Day 5. http://samos-r.netlify.app/SAMOS_Day_5.html.