Mapping The Vegetation and Climate of Africa in R

2017-09-05

As I’ll soon be embarking on my PhD research into biodiversity and woodland productivity in Southern Africa, I thought I should get a better idea of how the vegatation differs across the continent.

I normally try to use R instead of point and click GIS packages like ArcMap or QGIS, so all the code here is to be used in an R session.

The packages I used are:

library(maps)
library(rgdal)
library(ggplot2)
library(ggmap)

First I needed a base map of Africa, ideally with countries on, which I found here .

# Import shapefile of country borders ----
countries <- readOGR(dsn="africa", 
                     layer="Africa")
countries@data

countries_fort <- fortify(countries, region = "COUNTRY")

# Plot country borders ----
ggplot() + 
	geom_polygon(aes(x = long, y = lat, group = group, fill = NA), 
							 colour = "black", 
							 data = countries_fort) + 
	theme_classic()  + 
	scale_fill_manual(values = palette_veg_type_19) + 
	labs(fill = "Biome") + 
	xlab("Longitude") + 
	ylab("Latitude") + 
	coord_map()

To investigate vegetation types I tracked down a shapefile version of White&rsquo;s 1983 Vegetation Map . The map is the result of 15 years of work by UNESCO and AEFTET and was created by first compiling many existing maps, then cross-checking with extensive fieldwork and consultation with local experts.

White's map of vegetation types in Africa

To create the map above I used the ggplot2 and rgdal packages:

# Read shapefile ----
white_veg <- readOGR(dsn="whitesveg",
                     layer="Whites vegetation")

# Explore shapefile
white_veg@data
white_veg@bbox
white_veg@proj4string

# Fortify shapefile for use in ggplot2 ----
white_veg_fort <- fortify(white_veg, region = "DESCRIPTIO")
names(white_veg_fort)
length(unique(white_veg_fort$id))

# Create colour palette for ggplot2 ----
palette_veg_type_19 <- c("#FF4A46","#008941","#006FA6","#A30059","#FFDBE5",
                         "#7A4900","#0000A6","#63FFAC","#B79762","#004D43",
                         "#8FB0FF","#997D87","#5A0007","#809693","#FEFFE6",
                         "#1B4400","#4FC601","#3B5DFF","#4A3B53")

# ggplot Africa with vegetation ----
ggplot() + 
  geom_polygon(aes(x = long, y = lat, group = group, fill = id), 
               data = white_veg_fort) + 
  geom_polygon(aes(x = long, y = lat, group = group, fill = NA), 
               colour = "black", 
               data = countries_fort) + 
  theme_classic()  + 
  scale_fill_manual(values = palette_veg_type_19) + 
  labs(fill = "Biome") + 
  xlab("Longitude") + 
  ylab("Latitude") + 
  coord_map()

To look specifically at Southern Africa I had to use some trial and error to get the x and y limits right in the ggplot() call:

# ggplot Southern Africa ----
ggplot() +
  geom_polygon(aes(x = long, y = lat, group = group, fill = id),
               data = white_veg_fort) +
  geom_polygon(aes(x = long, y = lat, group = group, fill = NA),
               colour = "black",
               data = countries_fort) +
  theme_classic()  +
  scale_fill_manual(values = palette_veg_type_19) +
  labs(fill = "Biome") +
  xlab("Longitude") +
  ylab("Latitude") +
  coord_map(xlim = c(10, 40), ylim = c(-35, -10))

The steps once again for anyone interested in a mapping workflow in R:

  1. Import shapefile with readOGR()
  2. Explore shapefile
  3. “Fortify” shapefile for use in ggplot()
  4. Plot using ggplot()

I also wrote a tutorial for the Coding Club group I’m involved with on using R as a GIS