--- title: "Using the tidyverse with terra objects: the tidyterra package" author: Diego Hernangómez ORCID logo date: "2023-07-18" description: >- An introduction to the `tidyterra` **R** package. bibliography: paper.bib link-citations: yes editor_options: markdown: wrap: 80 tags: - R - CRAN - spatial - vector - raster - tidyverse - terra - ggplot2 output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Using the tidyverse with terra objects: the tidyterra package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE, out.width = "100%" ) ``` ## Summary `tidyterra` is an R [@r-project] package that allows manipulation of spatial data objects as provided by the `terra` package [@R-terra], using the syntax of several packages included in the tidyverse [@R-tidyverse], such as `dplyr` [@R-dplyr], `tidyr` [@R-tidyr], or `tibble` [@R-tibble]. Furthermore, `tidyterra` extends the functionality of the `ggplot2` package [@R-ggplot2] by providing additional geoms and stats [^1], as well as carefully chosen scales and color palettes specifically designed for map production. [^1]: The term "geoms" refers to geometric objects, and "stats" refers to statistical transformations, following the naming conventions of `ggplot2` `tidyterra` can manipulate the following classes of `terra` objects: 1. `SpatVector` objects, which represent vector data such as points, lines, or polygon geometries. 2. `SpatRaster` objects, which represent raster data in the form of a grid consisting of equally sized rectangles. Each rectangle can contain one or more values. The first stable version of `tidyterra` was included on CRAN on April 24, 2022, and has been actively used by other packages (@R-ebvcube, @R-biomod2, @R-inlabru, @R-rczechia, @R-sparrpowr) and cited in academic research and publications (@bahlburg2023, @moraga2023, @Leonardi2023) ever since. ## Statement of need The [tidyverse](https://www.tidyverse.org/) is a compilation of R packages that share an underlying design philosophy, grammar, and data structures. The packages within the tidyverse are widely used by R users for tidying, transforming, and visualizing data. The tidyverse is designed to work with tidy data (*"every column is a variable, every row is an observation, every cell is a single value"*), represented in the form of data frames or tibbles. However, it is possible to extend the functionality of tidyverse packages to work with new R object classes by registering the corresponding S3 methods [@wickham_s32019]. This means that `dplyr::mutate()` can be adapted to work with any object of class `foo` by creating the corresponding S3 method `mutate.foo()`. While other popular packages designed for spatial data handling, such as `sf` [@R-sf] or `stars` [@R-stars], already provide integration with the tidyverse as part of their infrastructure, `terra` objects lack this integration natively. Instead, `terra` offers a wide set of functions with their own syntax for transforming and visualizing `SpatRaster` and `SpatVector` objects. The `tidyterra` package was developed to address this integration gap. By providing the corresponding S3 methods, data analysts can apply the same syntax and functions they are already familiar with for rectangular data to the objects provided by `terra.` This enables users who are not familiar with spatial data analysis to approach this area more easily. In addition, `tidyterra` also offers functions for plotting `terra` objects using the `ggplot2` syntax. Although packages like `rasterVis` [@R-rastervis] and `ggspatial` [@R-ggspatial] already include similar functionality for `SpatRaster` objects, `tidyterra` functions also support `SpatVector` objects. Furthermore, `tidyterra` allows users to create faceted maps for multi-layer raster files and compute contour lines and contour-filled polygons. Lastly, `tidyterra` provides a collection of color palettes specifically designed for representing spatial phenomena [@whitebox]. Additionally, it implements the cross-blended hypsometric tints described by @Patterson_Jenny_2011. ### A note on performance The development philosophy of `tidyterra` consists on adapting `terra` objects to data frame-like structures by performing different data transformations, that ultimately may impact in the performance of the package. When working with large raster files (i.e. more than 10.000.000 cells), it is recommended to use the native `terra` syntax, that is specifically designed for handling this type of files. Note also that when possible, the help page of each function of `tidyterra` references its equivalent in `terra`. ## Example of use `tidyterra` is available on [CRAN](https://CRAN.R-project.org/package=tidyterra), so it can be easily installed using the following commands in R: ```{r eval=FALSE} install.packages("tidyterra") ``` The following example demonstrates how to manipulate a `SpatRaster` object using the `dplyr` syntax. Additionally, it illustrates how to seamlessly plot a `SpatRaster` object with `ggplot2` using the `geom_spatraster()` function: ```{r eval=FALSE} library(tidyterra) library(dplyr) library(ggplot2) library(scales) # Additional library for labels # Temperatures in Castille and Leon (selected months) rastertemp <- terra::rast(system.file("extdata/cyl_temp.tif", package = "tidyterra" )) # Rename with the tidyverse rastertemp <- rastertemp %>% rename(April = tavg_04, May = tavg_05, June = tavg_06) # Plot with facets ggplot() + geom_spatraster(data = rastertemp) + facet_wrap(~lyr, ncol = 2) + scale_fill_whitebox_c( palette = "muted", labels = label_number(suffix = "º"), n.breaks = 12, guide = guide_legend(reverse = TRUE) ) + labs( fill = "", title = "Average temperature in Castille and Leon (Spain)", subtitle = "Months of April, May and June" ) ``` ::: figure Faceted map with multi-layer raster file.

Figure 1: Faceted map with multi-layer raster file.

::: The package documentation includes several examples of the use of `tidyterra`, and it can be accessed online at . ## Acknowledgements I would like to thank Robert J. Hijmans for his advice and support in adapting some of the methods, as well as for the suggestions that helped us improve the functionalities of the package. I am also thankful to Dewey Dunnington, Brent Thorne, and the rest of contributors of the `ggspatial` package, which served as a key reference during the initial stages of the development of `tidyterra`. `tidyterra` also incorporates some pieces of code adapted from `ggplot2` for computing contours, which relies on the package `isoband` [@R-isoband] developed by Claus O. Wilke. ## References