I am a great fan of R package tmap. In my personal opinion it is the most effective tool to visualize and communicate spatial data analysis in R context.

I had one issue with it though - I struggled with titles. The package is set up in a way that the map title can overlap with the map itself. Most of the times this is not a problem, but sometimes the title can get out of hand - such a as in this (exaggerated) example:


hranice <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = T) 

# draw an ugly chart
tm_shape(hranice) + tm_polygons(col = "red") +
  tm_layout(title = "A Big, Fat Title...", frame = T, title.size = 5)

The solution to this problem is using the bbox parameter of the tmap::tm_shape() call.

In the following example I first store the bounding box of the NC map, then extend it by 50% in the northerly direction and finally convert it into a sf polygon to be used as a boudning box of the tmap::tm_shape() call.

bbox_new <- st_bbox(hranice) # current bounding box

xrange <- bbox_new$xmax - bbox_new$xmin # range of x values
yrange <- bbox_new$ymax - bbox_new$ymin # range of y values

# bbox_new[1] <- bbox_new[1] - (0.5 * xrange) # xmin - left
# bbox_new[3] <- bbox_new[3] + (0.5 * xrange) # xmax - right
# bbox_new[2] <- bbox_new[2] - (0.5 * yrange) # ymin - bottom
  bbox_new[4] <- bbox_new[4] + (0.5 * yrange) # ymax - top

bbox_new <- bbox_new %>%  # take the bounding box ...
  st_as_sfc() # ... and make it a sf polygon

# draw a prettier chart
tm_shape(hranice, bbox = bbox_new) + tm_polygons(col = "red") +
  tm_layout(title = "A Big, Fat Title...", frame = T, title.size = 5)

While maps drawn via the ggplot2 package do not suffer from the same problem - the title is drawn outside of the plot area, for better or worse - their bounding box can be also manipulated.

To do so it is necessary to use the xlim and ylim parameters of the ggplot2::coords_sf() call, as demonstrated by the following example:


ggplot(hranice) +
  geom_sf( fill = 'red') +
  coord_sf(xlim = st_coordinates(bbox_new)[c(1,2),1], # min & max of x values
           ylim = st_coordinates(bbox_new)[c(2,3),2]) + # min & max of y values
  ggtitle('a ggplot2 title')