Drawing map of a country with indications of cities, samples are now common tasks in R. But what about adding to such a map, neighboring countries? Here we go.

We will draw a map of Ivory Coast with its neighboring countries.

Let us first load the libraries:

library(tmap)   # to draw the map
library(tibble) # for sites table creation
library(sf)
library(maptools)
library(rgeos)
library(raster) # to download data

Then, let us create a tibble with the coordinates of our locations:

sites <- tribble(
  ~id, ~ Sites, ~ lat, ~ long,
  1, "Abengourou", 6.7146399, -3.5654096,
  2, "Aboisso", 5.4675302, -3.2185867,
  3, "Agboville", 5.9342509, -4.2500361,
  4, "Azaguié", 5.6305067, -4.0907336,
  5, "Dabou", 5.3242556,-4.4098582,
  6, "Grand-Bassam", 5.2198516, -3.7821731,
  7, "Tiassalé", 5.8985662, -4.8458078
)

The coordinates we have added needs to be converted into an sf object for plotting.

sf_obj <- st_as_sf(sites, coords = c("long", "lat"), crs = 4326) # 4326: Geodetic coordinate system for World

Let us now load the data of countries:

ivory_coast <- getData("GADM", country = "CIV", level = 1)
guinea <- getData("GADM", country = "Guinea", level = 0)
mali <- getData("GADM", country = "Mali", level = 0)
burkina <- getData("GADM", country = "Burkina Faso", level = 0)
ghana <- getData("GADM", country = "Ghana", level = 0)
liberia <- getData("GADM", country = "Liberia", level = 0)

Let us plot our map

# building the map of Cote d'Ivoire
tm_shape(ivory_coast) + # carte cote d'ivoire
  tm_polygons(col = "#f2f0f0") + # ajouter les polygones
  tm_shape(sf_obj) + 
  tm_symbols(size = 1.5) +
  tm_text("id") +
  tm_layout(frame = FALSE) + # remove box around map
  tm_shape(guinea) + tm_polygons(col = "white") + tm_text("NAME_0") +
  tm_shape(mali) + tm_polygons(col = "white") + tm_text("NAME_0") +
  tm_shape(burkina) + tm_polygons(col = "white") + tm_text("NAME_0") +
  tm_shape(ghana) + tm_polygons(col = "white") + tm_text("NAME_0") +
  tm_shape(liberia) + tm_polygons(col = "white") + tm_text("NAME_0")

As you can see it our neighboring countries are not really visible. So we need to extend the bounding box of our map.

# New bbox CI
bbox_civ <- st_bbox(ivory_coast) # current bounding box

xcrange <- bbox_civ$xmax - bbox_civ$xmin # range of x values
ycrange <- bbox_civ$ymax - bbox_civ$ymin # range of y values

bbox_civ[1] <- bbox_civ[1] - (0.35 * xcrange) # xmin - left
bbox_civ[3] <- bbox_civ[3] + (0.35 * xcrange) # xmax - right
bbox_civ[2] <- bbox_civ[2] - (0.1 * ycrange) # ymin - bottom
bbox_civ[4] <- bbox_civ[4] + (0.2 * ycrange) # ymax - top


bbox_civ <- bbox_civ %>%
  st_as_sfc()

Now let us enhance our previous plot:

civmap <- tm_shape(ivory_coast, bbox = bbox_civ) + # carte cote d'ivoire
  tm_polygons(col = "#f2f0f0") + # ajouter les polygones
  tm_shape(sf_obj) + 
  tm_symbols(size = 1.5) +
  tm_text("id") +
  tm_scale_bar(position = c("left", "bottom")) +
  tm_layout(frame = FALSE) + # remove box around map
  tm_compass(position = c("right", "top")) +
  tm_shape(guinea) + tm_polygons(col = "white") + tm_text("NAME_0", xmod = 5, ymod = -2) +
  tm_shape(mali) + tm_polygons(col = "white") + tm_text("NAME_0", xmod = -10, ymod = -18) +
  tm_shape(burkina) + tm_polygons(col = "white") + tm_text("NAME_0", xmod = -7, ymod = -4) +
  tm_shape(ghana) + tm_polygons(col = "white") + tm_text("NAME_0", xmod = -2, ymod = -2) +
  tm_shape(liberia) + tm_polygons(col = "white") + tm_text("NAME_0", xmod = 2, ymod = -2)

civmap

Now we can add a inset map of Africa pointing out where Cote d’Ivoire is located.

data("wrld_simpl")
afr <- wrld_simpl[wrld_simpl$REGION==2,]

# extracting bounding box Abidjan
region <- st_as_sfc(st_bbox(afr))

afrmap <- tm_shape(afr) + tm_polygons() + 
  tm_shape(ivory_coast) + tm_dots(shape = 16, size = 0.1, col = "orange") +
  tm_shape(region) + tm_borders(lwd = .2)

And now let us add the Africa map:

civmap
print(afrmap, vp = grid::viewport(0.13, 0.88, width = 0.23, height = 0.23))

Et voilà! Leave me a comment, if you have any ideas, observations or improvements.