TITLE: Making inset maps for publication DATE: 2019-02-20 AUTHOR: John L. Godlee ==================================================================== In scientific publications, often there is a map to describe the study location. For example in Burton et al. (2013), which is the first publication I found with an inset map by searching for the key word "inset map". ![Example inset map](https://johngodlee.xyz/img_full/inset/burton.png) I wanted to be able to make these maps directly in R, rather than manually exporting each map image and overlaying them in PowerPoint or Photoshop. The maps I make are in {ggplot2}, so the examples here all use ggplot2. The example involves making a map of Angola and adding some points of key cities, then adding an inset map showing the location of Angola in the world. First, load some packages: library(ggplot2) library(rworldmap) Then create fortified polygons by grabbing country data from {rworldmap}, using the getMap() function: world <- getMap(resolution = "low") world_f <- fortify(world) angola <- world[world@data$ADMIN == "Angola", ] angola_f <- fortify(angola) Then, make the inset world map, by wrapping the normal ggplot() call in ggplotGrob(): world_grob <- ggplotGrob( ggplot() + geom_polygon(data = world_f, aes(x = long, y = lat, group = group), fill = NA, colour = "black") + geom_polygon(data = angola_f, aes(x = long, y = lat), fill = "#F2C81F") + theme_void() + coord_quickmap() + theme(panel.background = element_rect(fill = "white", colour = "black")) ) This saves the ggplot object in a format that can be added later as an annotation_custom(). Then, create some city location data: city_location <- data.frame(city = c("Luanda", "Lubango"), long = c(13.267, 13.500), lat = c(-8.845, -14.918)) Then create a ggplot() object of the country of Angola, with the city locations added as geom_point(): angola_ggplot <- ggplot() + geom_polygon(data = angola_f, aes(x = long, y = lat), fill = "#F2C81F", colour = "black") + geom_point(data = city_location, aes(x = long, y = lat), colour = "black", size = 5) + geom_label(data = city_location, aes(x = long, y = lat, label = city), hjust = -0.2) + theme_classic() + coord_quickmap() + labs(x = "Longitude", y = "Latitude") Finally, plot angola_ggplot again, using annotation_custom() to add the world_grob: angola_ggplot + annotation_custom(grob = world_grob, xmin = 18, xmax = 26, ymin = -9, ymax = -4) annotation_custom() allows you to set the x and y location of the grob, using the coordinate system on the base plot, which in this case is decimal latitude and longitude. ![My inset map in R](https://johngodlee.xyz/img_full/inset/map.png)