mapsf

Timothée Giraud

2024-07-29

Introduction

The aim of mapsf is to obtain thematic maps with the visual quality of those build with a classical mapping or GIS software.

Users of the package could belong to one of two categories: cartographers willing to use R or R users willing to create maps. Therefore, its functions have to be intuitive to cartographers and ensure compatibility with common R workflows.

mapsf uses sf objects to produce base graphics.

mapsf functions can be classified in the following categories :

Main Features

Symbology

The type column indicates the value to use for the type argument in mf_map(x, var, type). The data column displays the relevant data types for each map types. The cartography column indicates the corresponding function in cartography.

map type type data polygon point line cartography
Base Map "base" geometry -
Proportional Symbols "prop" stock propSymbolsLayer()
Typology "typo" category typoLayer()
Choropleth "choro" ratio choroLayer()
Graduated Symbols "grad" stock -
Symbols "symb" category -
Proportional Symbols + Typo "prop_typo" stock & category propSymbolsTypoLayer()
Proportional Symbols + Choro "prop_choro" stock & ratio propSymbolsChoroLayer()
Symbols + Choro "symb_choro" category & ratio -

Map Layout

name cartography
mf_title() - / layoutLayer()
mf_arrow() north()
mf_credits() - / layoutLayer()
mf_scale() barscale()
mf_layout() layoutLayer()
mf_annotation() -
mf_label() labelLayer()

Themes

mf_theme() defines a map theme. It sets the margins of the figure, a background color, a foreground color and some parameters of the title. A set of theme is included in the package and it is possible to create custom ones.

Export

The mf_export() function exports maps in raster (.png) or vector formats (.svg). The size of the exported map will fit the height/width ratio of a spatial object.

Datasets

Several datasets are embedded in the package:

Examples of thematic maps

Base map

mf_theme() allows to apply a theme to the map.

mf_shadow() plots the shadow of a polygon layer.

mf_map(x, type = "base") displays sf objects geometries.

mf_layout() add a complete layout to the map (title, credits, north arrow, scale bar). Each layout elements can also be set separately (with mf_title(), mf_credits(), mf_arrow() and mf_scale()).

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set a theme
mf_theme("iceberg")
# plot a shadow
mf_shadow(mtq)
# plot municipalities
mf_map(mtq, type = "base", add = TRUE)
# layout
mf_layout(
  title = "Martinique",
  credits = paste0(
    "Sources: IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  )
)

Proportional Symbols

mf_map(x, var, type = "prop") displays symbols with areas proportional to a quantitative variable (stocks). The inches argument is used to customize the symbols sizes.

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set a theme
mf_theme("darkula")
# plot a shadow
mf_shadow(mtq)
# plot municipalities
mf_map(mtq, add = TRUE)
# plot population
mf_map(
  x = mtq,
  var = "POP",
  type = "prop",
  inches = 0.25,
  col = "brown4",
  leg_pos = "topright",
  leg_adj = c(0, -2),
  leg_title = "Total population"
)
# layout
mf_layout(
  title = "Population Distribution in Martinique",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  )
)

Choropleth Map

In choropleth maps, areas are shaded according to the variation of a quantitative variable. They are used to represent ratios or indices.
mf_map(x, var, type = "choro") displays choropleth maps . Arguments nbreaks, and breaks allow to customize the variable classification. mf_get_breaks() allows to classify data outside of the function itself. Colors palettes, defined with pal, can be created with mf_get_pal() or you can use palette names from hcl.pals().

Use mf_theme() to set a theme without plotting anything.

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# population density (inhab./km2) using sf::st_area()
mtq$POPDENS <- 1e6 * mtq$POP / sf::st_area(mtq)
# set a theme
mf_theme("green")
# plot population density
mf_map(
  x = mtq,
  var = "POPDENS",
  type = "choro",
  breaks = "geom",
  nbreaks = 5,
  pal = "Greens",
  border = "white",
  lwd = 0.5,
  leg_pos = "topright",
  leg_title = "Population Density\n(people per km2)"
)
# layout
mf_layout(
  title = "Population Distribution in Martinique",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  )
)

Typology Map

mf_map(x, var, type = "typo") displays a typology map of a qualitative variable. val_order is used to set the modalities order in the legend.

mf_label() displays labels on the map.

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set theme
mf_theme("dark")
# plot administrative status
mf_map(
  x = mtq,
  var = "STATUS",
  type = "typo",
  pal = c("aquamarine4", "yellow3", "wheat"),
  lwd = .5,
  val_order = c(
    "Prefecture",
    "Sub-prefecture",
    "Simple municipality"
  ),
  leg_pos = "topright",
  leg_adj = c(0, 1),
  leg_title = ""
)
# labels for a few  municipalities
mf_label(
  x = mtq[mtq$STATUS != "Simple municipality", ], var = "LIBGEO",
  cex = 0.9, halo = TRUE, r = 0.15
)
# layout
mf_layout(
  title = "Administrative Status",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  )
)

Proportional Symbols using Choropleth Coloration

mf_map(x, var, type = "prop_choro") creates a map of symbols that are proportional to values of a first variable and colored to reflect the classification of a second variable.

expandBB argument in mf_map() allows to expand the map space. Here, we increase the space available on the right of the map to avoid overlaps between the legends and the map.

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set theme
mf_theme("candy")
# Plot the municipalities and expand the map space on the right
mf_map(x = mtq, expandBB = c(0, 0, 0, .15))
# Plot symbols with choropleth coloration
mf_map(
  x = mtq,
  var = c("POP", "MED"),
  type = "prop_choro",
  border = "grey50",
  lwd = 1,
  leg_pos = c("topright"),
  leg_title = c("Population", "Median Income\n(in euros)"),
  breaks = "equal",
  nbreaks = 4,
  pal = "Greens",
  leg_val_rnd = c(0, -2),
  leg_frame = TRUE
)
# layout
mf_layout(
  title = "Population & Wealth in Martinique, 2015",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  ),
  frame = TRUE
)

Proportional Symbols using Typology Coloration

mf_map(x, var, type = "prop_typo") creates a map of symbols that are proportional to values of a first variable and colored to reflect the modalities of a second qualitative variable.

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set theme
mf_theme("ink")
# plot the municipalities and expand the map space on the right
mf_map(x = mtq, expandBB = c(0, 0, 0, .15))
# plot symbols with choropleth coloration
mf_map(
  x = mtq,
  var = c("POP", "STATUS"),
  type = "prop_typo",
  symbol = "square",
  border = "white",
  lwd = .5,
  leg_pos = "topright",
  leg_title = c("Population", "Administrative\nStatus"),
  val_order = c(
    "Prefecture", "Sub-prefecture",
    "Simple municipality"
  )
)
# layout
mf_layout(
  title = "Population Distribution in Martinique",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  )
)

Label Map

mf_label() is dedicated to the display of labels on a map. The overlap = FALSE argument displays non overlapping labels.

In this example we have built a custom theme with mf_theme().

library(mapsf)
# import the sample data set
mtq <- mf_get_mtq()
# set theme
my_theme <- list(
  name = "mytheme",
  bg = "lightblue1",
  fg = "darkseagreen4",
  mar = c(0, 0, 0, 0),
  tab = TRUE,
  pos = "left",
  inner = TRUE,
  line = 1,
  cex = .9,
  font = 3
)
mf_theme(my_theme)
# plot municipalities
mf_map(mtq, col = "#e4e9de", border = "darkseagreen4")
# plot labels
mf_label(
  x = mtq,
  var = "LIBGEO",
  col = "black",
  cex = 0.7,
  font = 4,
  halo = TRUE,
  bg = "white",
  r = 0.1,
  overlap = FALSE,
  lines = FALSE
)
# layout
mf_layout(
  title = "Municipalities of Martinique",
  credits = paste0(
    "Sources: Insee and IGN, 2018\n",
    "mapsf ",
    packageVersion("mapsf")
  ),
  arrow = FALSE
)
# north arrow
mf_arrow(pos = "topright")