---
title: "tmap: get started!"
output:
rmarkdown::html_vignette:
keep_md: true
toc: true
self_contained: no
vignette: >
%\VignetteIndexEntry{tmap: get started!}
%\VignetteEngine{knitr::rmarkdown}
\usepackage[utf8]{inputenc}
---
```{r, echo = FALSE, message = FALSE}
knitr::opts_chunk$set(collapse = T, fig.width=6, fig.height=3)
# devtools::install_github("mtennekes/tmaptools")
```
With the tmap package, thematic maps can be generated with great flexibility.
The syntax for creating plots is similar to that of `ggplot2`, but tailored to maps.
This vignette is for those who want to get started with tmap within a couple of minutes.
A more detailed description of tmap can be found in an [article](https://www.jstatsoft.org/article/view/v084i06) published in the Journal of Statistical Software ([JSS](https://www.jstatsoft.org/index)).
However, that article describes tmap version 1.11-2, which is out-of-date.
Some major changes have been made since then, which are described in [`vignette("tmap-changes")`](../doc/tmap-changes.html).
For more context on R's geographic capabilities we recommend the online version of the book [Geocomputation with R](https://r.geocompx.org/). The [Making maps with R](https://r.geocompx.org/adv-map) chapter of the book provides many more context and abundant code examples of map making with `tmap` and other packages. Other good resources are the vignettes of the [`sf` package](https://CRAN.R-project.org/package=sf/vignettes/sf1.html).
### Hello World!
A good place to start is to create a map of the world.
After [installing](https://github.com/r-tmap/tmap#installation) tmap, the following lines of code should create the map shown below:
```{r}
library(tmap)
data("World")
tm_shape(World) +
tm_polygons("HPI")
```
The object `World` is a spatial object of class `sf` from the [sf package](https://CRAN.R-project.org/package=sf); it is a `data.frame` with a special column that contains a geometry for each row, in this case polygons.
In order to plot it in tmap, you first need to specify it with `tm_shape`.
Layers can be added with the `+` operator, in this case `tm_polygons`.
There are many layer functions in tmap, which can easily be found in the documentation by their `tm_` prefix.
See also `?'tmap-element'`.
### Interactive maps
Each map can be plotted as a static image or viewed interactively using `"plot"` and `"view"` modes, respectively.
The mode can be set with the function `tmap_mode`, and toggling between the modes can be done with the 'switch' `ttm()` (which stands for toggle thematic map.
```{r, eval = FALSE}
tmap_mode("view")
tm_shape(World) +
tm_polygons("HPI")
```
### Multiple shapes and layers
A shape is a spatial object (with a class from `sf`, `sp`, `stars`, or `raster`).
Multiple shapes and also multiple layers per shape can be plotted:
```{r}
data(World, metro, rivers, land)
tmap_mode("plot")
tm_shape(land) +
tm_raster("elevation", palette = terrain.colors(10)) +
tm_shape(World) +
tm_borders("white", lwd = .5) +
tm_text("iso_a3", size = "AREA") +
tm_shape(metro) +
tm_symbols(col = "red", size = "pop2020", scale = .5) +
tm_legend(show = FALSE)
```
### Facets
Facets can be created in three ways:
1. By assigning multiple variable names to one aesthetic (in this example the first argument of `tm_polygons`:
```{r, eval = FALSE}
tmap_mode("view")
tm_shape(World) +
tm_polygons(c("HPI", "economy")) +
tm_facets(sync = TRUE, ncol = 2)
```
2. By splitting the spatial data with the `by` argument of `tm_facets`:
```{r}
tmap_mode("plot")
data(NLD_muni)
NLD_muni$perc_men <- NLD_muni$pop_men / NLD_muni$population * 100
tm_shape(NLD_muni) +
tm_polygons("perc_men", palette = "RdYlBu") +
tm_facets(by = "province")
```
3. By using the `tmap_arrange` function:
```{r}
tmap_mode("plot")
data(NLD_muni)
tm1 <- tm_shape(NLD_muni) + tm_polygons("population", convert2density = TRUE)
tm2 <- tm_shape(NLD_muni) + tm_bubbles(size = "population")
tmap_arrange(tm1, tm2)
```
### Basemaps and overlay tile maps
Tiled basemaps can be added with the layer function `tm_basemap`.
Semi-transparent overlay maps (for example annotation labels) can be added with `tm_tiles`.
```{r, eval = FALSE}
tmap_mode("view")
tm_basemap("Stamen.Watercolor") +
tm_shape(metro) + tm_bubbles(size = "pop2020", col = "red") +
tm_tiles("Stamen.TonerLabels")
```
See a [preview of the available tilemaps](https://leaflet-extras.github.io/leaflet-providers/preview/).
This list is also accessible in R: `leaflet::providers`.
### Options and styles
The functions `tm_layout` and `tm_view` are used to specify the map layout and the interactive aspects respectively.
These functions can be used in the same way as the layer functions, e.g.
```{r}
tmap_mode("plot")
tm_shape(World) +
tm_polygons("HPI") +
tm_layout(bg.color = "skyblue", inner.margins = c(0, .02, .02, .02))
```
These options, as well as a couple of others, can also be set within with `tmap_options`, which works in the same way as the base R function `options`.
The main advantage is that these options are set globally, so they do not have to be specified in each map, for the duration of the session.
```{r}
tmap_options(bg.color = "black", legend.text.color = "white")
tm_shape(World) +
tm_polygons("HPI", legend.title = "Happy Planet Index")
```
A style is a certain configuration of the tmap options.
```{r}
tmap_style("classic")
tm_shape(World) +
tm_polygons("HPI", legend.title = "Happy Planet Index")
```
```{r}
# see what options have been changed
tmap_options_diff()
# reset the options to the default values
tmap_options_reset()
```
New styles can be created; see `?tmap_options`.
### Exporting maps
```{r, eval = FALSE}
tm <- tm_shape(World) +
tm_polygons("HPI", legend.title = "Happy Planet Index")
## save an image ("plot" mode)
tmap_save(tm, filename = "world_map.png")
## save as stand-alone HTML file ("view" mode)
tmap_save(tm, filename = "world_map.html")
```
### Shiny integration
It is possible to use tmap in shiny:
```{r, eval = FALSE}
# in UI part:
tmapOutput("my_tmap")
# in server part
output$my_tmap = renderTmap({
tm_shape(World) + tm_polygons("HPI", legend.title = "Happy Planet Index")
})
```
See `?renderTmap` for a working example.
### Quick thematic map
Maps can also be made with one function call.
This function is `qtm`:
```{r}
qtm(World, fill = "HPI", fill.palette = "RdYlGn")
```
### Tips 'n Tricks
Run:
```{r, eval = FALSE}
tmap_tip()
```