Title: | 'tidyverse' Methods and 'ggplot2' Helpers for 'terra' Objects |
---|---|
Description: | Extension of the 'tidyverse' for 'SpatRaster' and 'SpatVector' objects of the 'terra' package. It includes also new 'geom_' functions that provide a convenient way of visualizing 'terra' objects with 'ggplot2'. |
Authors: | Diego Hernangómez [aut, cre, cph]
|
Maintainer: | Diego Hernangómez <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.4.0 |
Built: | 2023-09-10 08:09:40 UTC |
Source: | https://github.com/dieghernan/tidyterra |
arrange()
orders the geometries of a SpatVector by the values of
selected columns.
## S3 method for class 'SpatVector'
arrange(.data, ..., .by_group = FALSE)
.data |
A SpatVector created with |
... |
< |
.by_group |
If |
A SpatVector object.
Implementation of the generic dplyr::arrange()
function for
SpatVectors.
Other single table verbs:
filter.Spat
,
mutate.Spat
,
rename.Spat
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on rows:
distinct.SpatVector()
,
filter.Spat
,
slice.Spat
Other dplyr methods:
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
library(dplyr)
v <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
# Single variable
v %>%
arrange(desc(iso2))
# Two variables
v %>%
mutate(even = as.double(cpro) %% 2 == 0, ) %>%
arrange(desc(even), desc(iso2))
# With new variables
v %>%
mutate(area_geom = terra::expanse(v)) %>%
arrange(area_geom)
as_coordinates()
can be used to obtain the position of each cell on the
SpatRaster matrix.
as_coordinates(x, as.raster = FALSE)
x |
A SpatRaster object |
as.raster |
If |
A tibble or a SpatRaster (if as.raster = TRUE
) with the same number of
rows (or cells) than the number of cells in x
.
When as.raster = TRUE
the resulting SpatRaster has the same crs, extension
and resolution than x
Coercing objects:
as_sf()
,
as_spatraster()
,
as_spatvector()
,
as_tibble.Spat
,
fortify.Spat
library(terra)
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
r <- rast(f)
as_coordinates(r)
as_coordinates(r, as.raster = TRUE)
as_coordinates(r, as.raster = TRUE) %>% plot()
as_sf()
turns a SpatVector to sf. This is a wrapper of sf::st_as_sf()
with the particularity that the groups created with group_by()
are
preserved.
as_sf(x, ...)
x |
A SpatVector. |
... |
additional arguments passed on to |
A sf object.
Coercing objects:
as_coordinates()
,
as_spatraster()
,
as_spatvector()
,
as_tibble.Spat
,
fortify.Spat
library(terra)
f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
v <- terra::vect(f)
# This is ungrouped
v
is_grouped_spatvector(v)
# Get an ungrouped data
a_sf <- as_sf(v)
dplyr::is_grouped_df(a_sf)
# Grouped
v$gr <- c("C", "A", "A", "B", "A", "B", "B")
v$gr2 <- rep(c("F", "G", "F"), 3)
gr_v <- group_by(v, gr, gr2)
gr_v
is_grouped_spatvector(gr_v)
group_data(gr_v)
# A sf
a_gr_sf <- as_sf(gr_v)
dplyr::is_grouped_df(a_gr_sf)
group_data(a_gr_sf)
as_spatraster()
turns an existing data frame or tibble, into a SpatRaster.
This is a wrapper of terra::rast()
S4 method for data.frame
.
as_spatraster(x, ..., xycols = 1:2, crs = "", digits = 6)
x |
A tibble or data frame. |
... |
additional arguments passed on to |
xycols |
A vector of integers of length 2 determining the position of the columns that hold the x and y coordinates. |
crs |
A crs on several formats (PROJ.4, WKT, EPSG code, ..) or
and spatial object from sf or terra that includes the target coordinate
reference system. See |
digits |
integer to set the precision for detecting whether points are on a regular grid (a low number of digits is a low precision). |
If no
crs
is provided and the tibble
has been created with the method as_tibble.SpatRaster()
, the crs
is
inferred from attr(x, "crs")
.
A SpatRaster.
Coercing objects:
as_coordinates()
,
as_sf()
,
as_spatvector()
,
as_tibble.Spat
,
fortify.Spat
library(terra)
r <- rast(matrix(1:90, ncol = 3), crs = "EPSG:3857")
r
# Create tibble
as_tbl <- as_tibble(r, xy = TRUE)
as_tbl
# From tibble
newrast <- as_spatraster(as_tbl, crs = "EPSG:3857")
newrast
as_spatvector()
turns an existing object into a SpatVector. This is a
wrapper of terra::vect()
S4 method.
as_spatvector(x, ...)
## S3 method for class 'data.frame'
as_spatvector(x, ..., geom = c("lon", "lat"), crs = "")
## S3 method for class 'sf'
as_spatvector(x, ...)
## S3 method for class 'sfc'
as_spatvector(x, ...)
## S3 method for class 'SpatVector'
as_spatvector(x, ...)
x |
A tibble, data frame, sf or sfc object. |
... |
additional arguments passed on to |
geom |
character. The field name(s) with the geometry data. Either two names for x and y coordinates of points, or a single name for a single column with WKT geometries. |
crs |
A crs on several formats (PROJ.4, WKT, EPSG code, ..) or
and spatial object from sf or terra that includes the target coordinate
reference system. See |
This function differs from terra::vect()
on the following:
geometries with NA/""
values are removed prior to conversion
If x
is a grouped data frame (see dplyr::group_by()
) the grouping
vars are transferred and a "grouped" SpatVector is created (see
group_by.SpatVector()
).
If no crs
is provided and the tibble has been created with the method
as_tibble.SpatVector()
, the crs
is inferred from attr(x, "crs")
.
Handles correctly the conversion of EMPTY
geometries between sf
and terra.
A SpatVector.
Coercing objects:
as_coordinates()
,
as_sf()
,
as_spatraster()
,
as_tibble.Spat
,
fortify.Spat
library(terra)
v <- vect(matrix(1:80, ncol = 2), crs = "EPSG:3857")
v$cat <- sample(LETTERS[1:4], size = nrow(v), replace = TRUE)
v
# Create tibble
as_tbl <- as_tibble(v, geom = "WKT")
as_tbl
# From tibble
newvect <- as_spatvector(as_tbl, geom = "geometry", crs = "EPSG:3857")
newvect
as_tibble()
method for SpatRaster and SpatVector.
## S3 method for class 'SpatRaster'
as_tibble(x, ..., xy = FALSE, na.rm = FALSE, .name_repair = "unique")
## S3 method for class 'SpatVector'
as_tibble(x, ..., geom = NULL, .name_repair = "unique")
x |
A SpatRaster created with |
... |
Arguments passed on to |
xy |
logical. If |
na.rm |
logical. If |
.name_repair |
Treatment of problematic column names:
|
geom |
character or NULL. If not NULL, either "WKT" or "HEX", to get the geometry included in Well-Known-Text or hexadecimal notation. If |
A tibble.
Implementation of the generic tibble::as_tibble()
function.
The tibble is returned with an attribute
including the crs of the initial object in WKT format (see
pull_crs()
).
When coercing SpatRaster objects to data frames, x
and y
names are
reserved for geographic coordinates of each cell of the raster. It should be
also noted that terra allows layers with duplicated names.
In the process of coercing a SpatRaster to a tibble, tidyterra may rename the layers of your SpatRaster for overcoming this issue. Specifically, layers may be renamed on the following cases:
Layers with duplicated names
When coercing to a tibble, if xy = TRUE
, layers named x
or y
would be
renamed.
When working with tidyverse methods (i.e. filter.SpatRaster()
), the
latter would happen as well.
tidyterra would display a message informing of the changes on the names of the layer.
The same issue happens for SpatVector with names geometry
(when
geom = c("WKT", "HEX")
) and x
, y
(when geom = "XY"
). These are
reserved names representing the geometry of the SpatVector (see
terra::as.data.frame()
). If geom
is not NULL
then the logic described
for SpatRaster would apply as well for the columns of the SpatVector.
tibble::as_tibble()
, terra::as.data.frame()
Coercing objects:
as_coordinates()
,
as_sf()
,
as_spatraster()
,
as_spatvector()
,
fortify.Spat
library(terra)
# SpatRaster
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
r <- rast(f)
as_tibble(r, na.rm = TRUE)
as_tibble(r, xy = TRUE)
# SpatVector
f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
v <- vect(f)
as_tibble(v)
autoplot()
uses ggplot2 to draw plots as the ones produced by
terra::plot()
/terra::plotRGB()
in a single command.
## S3 method for class 'SpatRaster'
autoplot(object, ..., rgb = NULL, facets = NULL, nrow = NULL, ncol = 2)
## S3 method for class 'SpatVector'
autoplot(object, ...)
object |
A SpatRaster created with |
... |
other arguments passed to |
rgb |
Logical. Should be plotted as a RGB image? If |
facets |
Logical. Should facets be displayed? If |
nrow , ncol
|
Number of rows and columns on the facet. |
Implementation of ggplot2::autoplot()
.
A ggplot2 layer
Implementation of the generic ggplot2::autoplot()
function.
Uses geom_spatraster()
or geom_spatraster_rgb()
.
Uses geom_spatvector()
. Labels can be placed with geom_spatvector_text()
or geom_spatvector_label()
Other ggplot2 utils:
fortify.Spat
,
geom_spat_contour
,
geom_spatraster_rgb()
,
geom_spatraster()
,
ggspatvector
,
stat_spat_coordinates()
Other ggplot2 methods:
fortify.Spat
file_path <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
library(terra)
temp <- rast(file_path)
library(ggplot2)
autoplot(temp)
# With a tile
tile <- system.file("extdata/cyl_tile.tif", package = "tidyterra") %>%
rast()
autoplot(tile)
# With vectors
v <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
autoplot(v)
v %>% autoplot(aes(fill = cpro)) +
geom_spatvector_text(aes(label = iso2)) +
coord_sf(crs = 25829)
Bind any number of SpatVector, data frames and sf object by column, making a
wider result. This is similar to do.call(cbind, dfs)
.
Where possible prefer using a join to combine
SpatVectors and data frames. bind_spat_cols()
binds the rows in order in
which they appear so it is easy to create meaningless results without
realizing it.
bind_spat_cols(
...,
.name_repair = c("unique", "universal", "check_unique", "minimal")
)
... |
SpatVector to combine. The first argument should be a SpatVector and each of the subsequent arguments can either be a SpatVector, a sf object or a data frame. Inputs are recycled to the same length, then matched by position. |
.name_repair |
One of |
A SpatVector with the corresponding cols. The geometry and CRS
would correspond to the the first SpatVector of ...
.
cbind()
method
Implementation of the dplyr::bind_rows()
function for
SpatVectors. Note that for the second and subsequent arguments on ...
the
geometry would not be cbind
ed, and only the data frame (-ish) columns
would be kept.
Other dplyr verbs that operate on pairs Spat*/data.frame:
bind_rows.SpatVector
,
filter-joins.SpatVector
,
mutate-joins.SpatVector
Other dplyr methods:
arrange.SpatVector()
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
sv <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
df2 <- data.frame(letters = letters[seq_len(nrow(sv))])
# Data frame
bind_spat_cols(sv, df2)
# Another SpatVector
bind_spat_cols(sv[1:2, ], sv[3:4, ])
# sf objects
sfobj <- sf::read_sf(system.file("shape/nc.shp", package = "sf"))
bind_spat_cols(sv[1:9, ], sfobj[1:9, ])
# Mixed
end <- bind_spat_cols(sv, sfobj[seq_len(nrow(sv)), 1:2], df2)
end
glimpse(end)
# Row sizes must be compatible when column-binding
try(bind_spat_cols(sv, sfobj))
Bind any number of SpatVector, data frames and sf object by row, making a
longer result. This is similar to do.call(rbind, dfs)
, but the output
will contain all columns that appear in any of the inputs.
bind_spat_rows(..., .id = NULL)
... |
SpatVector to combine. The first argument should be a SpatVector
and each of the subsequent arguments can either be a SpatVector, a sf object
or a data frame. Columns are matched by name, and any missing columns will
be filled with |
.id |
The name of an optional identifier column. Provide a string to create an output column that identifies each input. The column will use names if available, otherwise it will use positions. |
A SpatVector of the same type as the first element of ...
.
rbind()
method
Implementation of the dplyr::bind_rows()
function for
SpatVectors.
The first element of ...
should be a SpatVector. Subsequent elements may
be SpatVector, sf/sfc objects or data frames:
If subsequent SpatVector/sf/sfc present a different CRS than the first element, those elements would be reprojected to the CRS of the first element with a message.
If any element of ...
is a tibble/data frame the rows would be
cbind
ed with empty geometries with a message.
Other dplyr verbs that operate on pairs Spat*/data.frame:
bind_cols.SpatVector
,
filter-joins.SpatVector
,
mutate-joins.SpatVector
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
v <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
v1 <- v[1, "cpro"]
v2 <- v[3:5, c("name", "iso2")]
# You can supply individual SpatVector as arguments:
bind_spat_rows(v1, v2)
# When you supply a column name with the `.id` argument, a new
# column is created to link each row to its original data frame
bind_spat_rows(v1, v2, .id = "id")
# Use with sf
sfobj <- sf::st_as_sf(v2[1, ])
sfobj
bind_spat_rows(v1, sfobj)
# Would reproject with a message on different CRS
sfobj_3857 <- as_spatvector(sfobj) %>% project("EPSG:3857")
bind_spat_rows(v1, sfobj_3857)
# And with data frames with a message
data("mtcars")
bind_spat_rows(v1, sfobj, mtcars, .id = "id2")
# Use lists
bind_spat_rows(list(v1[1, ], sfobj[1:2, ]))
# Or named list combined with .id
bind_spat_rows(list(
SpatVector = v1[1, ], sf = sfobj[1, ],
mtcars = mtcars[1, ]
), .id = "source")
Two SpatRasters are compatible (in terms of combining layers) if the
crs, extent and resolution are similar. In those cases you can combine
the SpatRasters simply as c(x, y)
.
This function compares those attributes informing of the results. See Solving issues section for minimal guidance.
compare_spatrasters(x, y, digits = 6)
x , y
|
SpatRaster objects |
digits |
Integer to set the precision for comparing the extent and the resolution. |
A invisible logical TRUE/FALSE
indicating if the SpatRasters are
compatible, plus an informative message flagging the issues found (if any).
On non-equal crs, try terra::project()
. On non-equal extent try
terra::resample()
. On non-equal resolution you can try
terra::resample()
, terra::aggregate()
or terra::disagg()
.
Other helpers:
is_grouped_spatvector()
,
is_regular_grid()
,
pull_crs()
library(terra)
x <- rast(matrix(1:90, ncol = 3), crs = "EPSG:3857")
# Nothing
compare_spatrasters(x, x)
# Different crs
y_nocrs <- x
crs(y_nocrs) <- NA
compare_spatrasters(x, y_nocrs)
# Different extent
compare_spatrasters(x, x[1:10, , drop = FALSE])
# Different resolution
y_newres <- x
res(y_newres) <- res(x) / 2
compare_spatrasters(x, y_newres)
# Everything
compare_spatrasters(x, project(x, "epsg:3035"))
count()
lets you quickly count the unique values of one or more variables:
df %>% count(a, b)
is roughly equivalent to
df %>% group_by(a, b) %>% summarise(n = n())
.
count()
is paired with tally()
, a lower-level helper that is equivalent
to df %>% summarise(n = n())
.
## S3 method for class 'SpatVector'
count(
x,
...,
wt = NULL,
sort = FALSE,
name = NULL,
.drop = group_by_drop_default(x),
.dissolve = TRUE
)
## S3 method for class 'SpatVector'
tally(x, wt = NULL, sort = FALSE, name = NULL)
x |
A SpatVector. |
... |
< |
wt |
Not implemented on this method |
sort |
If |
name |
The name of the new column in the output. If omitted, it will default to |
.drop |
Handling of factor levels that don't appear in the data, passed
on to For
|
.dissolve |
logical. Should borders between aggregated geometries be dissolved? |
A SpatVector object with an additional attribute.
Implementation of the generic dplyr::count()
family functions for
SpatVectors.
tally()
will always return a disaggregated geometry while count()
can
handle this. See also summarise.SpatVector()
.
dplyr::count()
, dplyr::tally()
Other dplyr verbs that operate on group of rows:
group-by.SpatVector
,
rowwise.SpatVector()
,
summarise.SpatVector()
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("ex/lux.shp", package = "terra")
p <- vect(f)
p %>% count(NAME_1, sort = TRUE)
p %>% count(NAME_1, sort = TRUE)
p %>% count(pop = ifelse(POP < 20000, "A", "B"))
# tally() is a lower-level function that assumes you've done the grouping
p %>% tally()
p %>%
group_by(NAME_1) %>%
tally()
# Dissolve geometries by default
library(ggplot2)
p %>%
count(NAME_1) %>%
ggplot() +
geom_spatvector(aes(fill = n))
# Opt out
p %>%
count(NAME_1, .dissolve = FALSE, sort = TRUE) %>%
ggplot() +
geom_spatvector(aes(fill = n))
A tibble including the color map of
4 gradient palettes.
All the palettes includes also a definition of colors limits in terms of
elevation (meters), that can be used with ggplot2::scale_fill_gradientn()
.
A tibble of 41 rows and 6 columns. with the following fields:
pal: Name of the palette.
limit: Recommended elevation limit (in meters) for each color.
r,g,b: Value of the red, green and blue channel (RGB color mode).
hex: Hex code of the color.
From Patterson & Jenny (2011):
More recently, the role and design of hypsometric tints have come under scrutiny. One reason for this is the concern that people misread elevation colors as climate or vegetation information. Cross-blended hypsometric tints, introduced in 2009, are a partial solution to this problem. They use variable lowland colors customized to match the differing natural environments of world regions, which merge into one another.
Derived from Patterson, T., & Jenny, B. (2011). The Development and Rationale of Cross-blended Hypsometric Tints. Cartographic Perspectives, (69), 31 - 46. doi:10.14714/CP69.20.
Other datasets:
hypsometric_tints_db
,
volcano2
data("cross_blended_hypsometric_tints_db")
cross_blended_hypsometric_tints_db
# Select a palette
warm <- cross_blended_hypsometric_tints_db %>%
filter(pal == "warm_humid")
f <- system.file("extdata/asia.tif", package = "tidyterra")
r <- terra::rast(f)
library(ggplot2)
p <- ggplot() +
geom_spatraster(data = r) +
labs(fill = "elevation")
p +
scale_fill_gradientn(colors = warm$hex)
# Use with limits
p +
scale_fill_gradientn(
colors = warm$hex,
values = scales::rescale(warm$limit),
limit = range(warm$limit),
na.value = "lightblue"
)
Keep only unique/distinct rows and geometries from a SpatVector.
## S3 method for class 'SpatVector'
distinct(.data, ..., .keep_all = FALSE)
.data |
A SpatVector created with |
... |
< |
.keep_all |
If |
A SpatVector object.
Implementation of the generic dplyr::distinct()
function.
It is possible to remove duplicate geometries including the geometry
variable explicitly in the ...
call. See Examples.
dplyr::distinct()
, terra::unique()
Other dplyr verbs that operate on rows:
arrange.SpatVector()
,
filter.Spat
,
slice.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
v <- vect(system.file("ex/lux.shp", package = "terra"))
# Create a vector with dups
v <- v[sample(seq_len(nrow(v)), 100, replace = TRUE), ]
v$gr <- sample(LETTERS[1:3], 100, replace = TRUE)
# All duplicates
ex1 <- distinct(v)
ex1
nrow(ex1)
# Duplicates by NAME_1
ex2 <- distinct(v, gr)
ex2
nrow(ex2)
# Same but keeping all cols
ex2b <- distinct(v, gr, .keep_all = TRUE)
ex2b
nrow(ex2b)
# Unique geometries
ex3 <- distinct(v, geometry)
ex3
nrow(ex3)
# Same as terra::unique()
terra::unique(ex3)
# Unique keeping info
distinct(v, geometry, .keep_all = TRUE)
drop_na()
method drops geometries where any attribute specified by ...
contains a missing value.
## S3 method for class 'SpatVector'
drop_na(data, ...)
data |
A SpatVector created with |
... |
|
A Spat* object of the same class than .data
. See Methods.
Implementation of the generic tidyr::drop_na()
function.
The implementation of this method is performed on a by-attribute
basis,
meaning that NAs
are assessed on the attributes (columns) of each vector
(rows). The result is a SpatVector with potentially less geometries than the
input
tidyr::drop_na()
. A method for
SpatRaster is also available, see
drop_na.SpatRaster()
.
Other tidyr.methods:
replace_na.Spat
library(terra)
f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
v <- terra::vect(f)
# Add NAs
v <- v %>% mutate(iso2 = ifelse(cpro <= "09", NA, cpro))
# Init
plot(v, col = "red")
# Mask with lyr.1
v %>%
drop_na(iso2) %>%
plot(col = "red")
Filtering joins filter rows from x
based on the presence or absence of
matches in y
:
semi_join()
return all rows from x
with a match in y
.
anti_join()
return all rows from x
without a match in y
.
See dplyr::semi_join()
for details.
## S3 method for class 'SpatVector'
semi_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'SpatVector'
anti_join(x, y, by = NULL, copy = FALSE, ...)
x |
A SpatVector created with |
y |
A data frame or other object coercible to a data frame. If a
SpatVector of sf object is provided it would return an error (see
|
by |
A join specification created with If To join on different variables between To join by multiple variables, use a
For simple equality joins, you can alternatively specify a character vector
of variable names to join by. For example, To perform a cross-join, generating all combinations of |
copy |
If |
... |
Other parameters passed onto methods. |
A SpatVector object.
Implementation of the generic dplyr::semi_join()
family
The geometry column has a sticky behavior. This means that the result would
have always the geometry of x
for the records that matches the join
conditions.
dplyr::semi_join()
, dplyr::anti_join()
, terra::merge()
Other dplyr verbs that operate on pairs Spat*/data.frame:
bind_cols.SpatVector
,
bind_rows.SpatVector
,
mutate-joins.SpatVector
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
library(ggplot2)
# Vector
v <- terra::vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
# A data frame
df <- data.frame(
cpro = sprintf("%02d", 1:10),
x = runif(10),
y = runif(10),
letter = rep_len(LETTERS[1:3], length.out = 10)
)
v
# Semi join
semi <- v %>% semi_join(df)
semi
autoplot(semi, aes(fill = iso2)) + ggtitle("Semi Join")
# Anti join
anti <- v %>% anti_join(df)
anti
autoplot(anti, aes(fill = iso2)) + ggtitle("Anti Join")
The filter()
function is used to subset Spat* objects, retaining all
cells/geometries that satisfy your conditions. To be retained, the
cell/geometry must produce a value of TRUE
for all conditions.
It is possible to filter a SpatRaster by its geographic coordinates.
You need to use filter(.data, x > 42)
. Note that x
and y
are reserved
names on terra, since they refer to the geographic coordinates of the layer.
See Examples and section About layer names
on as_tibble()
.
## S3 method for class 'SpatRaster'
filter(.data, ..., .preserve = FALSE, .keep_extent = TRUE)
## S3 method for class 'SpatVector'
filter(.data, ..., .preserve = FALSE)
.data |
A SpatRaster created with |
... |
|
.preserve |
Ignored for Spat* objects. |
.keep_extent |
Should the extent of the resulting SpatRaster be kept? On
|
A Spat* object of the same class than .data
. See Methods.
Implementation of the generic dplyr::filter()
function.
Cells that do not fulfill the conditions on ...
are returned with value
NA
. On a multi-layer SpatRaster the NA
is propagated across all the
layers.
If .keep_extent = TRUE
the returning SpatRaster has the same crs, extent,
resolution and hence the same number of cells than .data
. If
.keep_extent = FALSE
the outer NA
cells are trimmed with terra::trim()
,
so the extent and number of cells may differ. The output would present in
any case the same crs and resolution than .data
.
x
and y
variables (i.e. the longitude and latitude of the SpatRaster)
are also available internally for filtering. See Examples.
The result is a SpatVector with all the geometries that produce a value of
TRUE
for all conditions.
Other single table verbs:
arrange.SpatVector()
,
mutate.Spat
,
rename.Spat
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on rows:
arrange.SpatVector()
,
distinct.SpatVector()
,
slice.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
r <- rast(f) %>% select(tavg_04)
plot(r)
# Filter temps
r_f <- r %>% filter(tavg_04 > 11.5)
# Extent is kept
plot(r_f)
# Filter temps and extent
r_f2 <- r %>% filter(tavg_04 > 11.5, .keep_extent = FALSE)
# Extent has changed
plot(r_f2)
# Filter by geographic coordinates
r2 <- project(r, "epsg:4326")
r2 %>% plot()
r2 %>%
filter(
x > -4,
x < -2,
y > 42
) %>%
plot()
Fortify SpatRasters and SpatVectors to data frames for compatibility with
ggplot2::ggplot()
.
## S3 method for class 'SpatRaster'
fortify(
model,
data,
...,
.name_repair = "unique",
maxcell = terra::ncell(model) * 1.1
)
## S3 method for class 'SpatVector'
fortify(model, data, ...)
model |
A SpatRaster created with |
data |
Not used by this method. |
... |
other arguments passed to methods |
.name_repair |
Treatment of problematic column names:
|
maxcell |
positive integer. Maximum number of cells to use for the plot. |
fortify.SpatVector()
returns a sf
object and
fortify.SpatRaster()
returns a tibble. See Methods.
Implementation of the generic ggplot2::fortify()
function.
Return a tibble than can be used with ggplot2::geom_*
like
ggplot2::geom_point()
, ggplot2::geom_raster()
, etc.
The resulting tibble includes the coordinates on the columns x,y
. The
values of each layer are included as additional columns named as per the
name of the layer on the SpatRaster.
The CRS of the SpatRaster can be retrieved with
attr(<fortifiedSpatRaster>, "crs")
.
It is possible to convert the fortified object onto a SpatRaster again with
as_spatraster()
.
Return a sf
object than can be used with ggplot2::geom_sf()
.
sf::st_as_sf()
, as_tibble.Spat, as_spatraster()
,
ggplot2::fortify()
.
Other ggplot2 utils:
autoplot.Spat
,
geom_spat_contour
,
geom_spatraster_rgb()
,
geom_spatraster()
,
ggspatvector
,
stat_spat_coordinates()
Other ggplot2 methods:
autoplot.Spat
Coercing objects:
as_coordinates()
,
as_sf()
,
as_spatraster()
,
as_spatvector()
,
as_tibble.Spat
# Get a SpatRaster
r <- system.file("extdata/volcano2.tif", package = "tidyterra") %>%
terra::rast()
fortified <- ggplot2::fortify(r)
fortified
# The crs is an attribute of the fortified SpatRaster
attr(fortified, "crs")
# Back to a SpatRaster with
as_spatraster(fortified)
# You can now use a SpatRaster with raster, contours, etc.
library(ggplot2)
# Use here the raster with resample
ggplot(r, maxcell = 10000) +
# Need the aes parameters
geom_raster(aes(x, y, fill = elevation)) +
# Adjust the coords
coord_equal()
# Or any other geom
ggplot(r) +
geom_histogram(aes(x = elevation),
bins = 20, fill = "lightblue",
color = "black"
)
# Create a SpatVector
extfile <- system.file("extdata/cyl.gpkg", package = "tidyterra")
cyl <- terra::vect(extfile)
cyl
# To sf
ggplot2::fortify(cyl)
# Now you can use geom_sf()
library(ggplot2)
ggplot(cyl) +
geom_sf()
These geoms create contours of SpatRaster objects. To specify a valid
surface, you should specify the layer on aes(z = layer_name)
, otherwise all
the layers would be consider for creating contours. See also Facets
section.
The underlying implementation is based on ggplot2::geom_contour()
.
geom_spatraster_contour(
mapping = NULL,
data,
...,
maxcell = 5e+05,
bins = NULL,
binwidth = NULL,
breaks = NULL,
na.rm = TRUE,
show.legend = NA,
inherit.aes = TRUE
)
geom_spatraster_contour_filled(
mapping = NULL,
data,
...,
maxcell = 5e+05,
bins = NULL,
binwidth = NULL,
breaks = NULL,
na.rm = TRUE,
show.legend = NA,
inherit.aes = TRUE
)
mapping |
Set of aesthetic mappings created by |
data |
A SpatRaster object. |
... |
Other arguments passed on to |
maxcell |
positive integer. Maximum number of cells to use for the plot. |
bins |
Number of contour bins. Overridden by |
binwidth |
The width of the contour bins. Overridden by |
breaks |
One of:
Overrides |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
A ggplot2 layer
geom_spatraster_contour
() understands the following aesthetics:
alpha
colour
group
linetype
linewidth
weight
Additionally, geom_spatraster_contour_filled()
understands also the
following aesthetics, as well as the ones listed above:
fill
subgroup
Check ggplot2::geom_contour()
for more info.
This geom computes internally some variables that are available for use as
aesthetics, using (for example) aes(color = after_stat(<computed>))
(see
ggplot2::after_stat()
).
level
Height of contour. For contour lines, this is numeric vector that represents bin boundaries. For contour bands, this is an ordered factor that represents bin ranges.
nlevel
Height of contour, scaled to maximum of 1.
lyr
Name of the layer.
level_low
, level_high
, level_mid
(contour bands only) Lower and upper bin boundaries for each band, as well the mid point between the boundaries.
When the SpatRaster does not present a crs (i.e.,
terra::crs(rast) == ""
) the geom does not make any assumption on the
scales.
On SpatRaster that have a crs, the geom uses ggplot2::coord_sf()
to adjust
the scales. That means that also the SpatRaster may be reprojected.
You can use facet_wrap(~lyr)
for creating a faceted plot by each layer of
the SpatRaster object. See ggplot2::facet_wrap()
for details.
Other ggplot2 utils:
autoplot.Spat
,
fortify.Spat
,
geom_spatraster_rgb()
,
geom_spatraster()
,
ggspatvector
,
stat_spat_coordinates()
library(terra)
# Raster
f <- system.file("extdata/volcano2.tif", package = "tidyterra")
r <- rast(f)
library(ggplot2)
ggplot() +
geom_spatraster_contour(data = r)
ggplot() +
geom_spatraster_contour(
data = r, aes(color = after_stat(level)),
binwidth = 1,
linewidth = 0.4
) +
scale_color_gradientn(
colours = hcl.colors(20, "Inferno"),
guide = guide_coloursteps()
) +
theme_minimal()
# Filled with breaks
ggplot() +
geom_spatraster_contour_filled(data = r, breaks = seq(80, 200, 10)) +
scale_fill_hypso_d()
# Both lines and contours
ggplot() +
geom_spatraster_contour_filled(
data = r, breaks = seq(80, 200, 10),
alpha = .7
) +
geom_spatraster_contour(
data = r, breaks = seq(80, 200, 2.5),
color = "grey30",
linewidth = 0.1
) +
scale_fill_hypso_d()
This geom is used to visualise SpatRaster objects (see terra::rast()
). The
geom is designed for visualise the object by layers, as terra::plot()
does.
For plotting SpatRaster objects as map tiles (i.e. RGB SpatRaster), use
geom_spatraster_rgb()
.
The underlying implementation is based on ggplot2::geom_raster()
.
stat_spatraster()
is provided as a complementary function, so the geom
can be modified.
geom_spatraster(
mapping = aes(),
data,
na.rm = TRUE,
show.legend = NA,
inherit.aes = FALSE,
interpolate = FALSE,
maxcell = 5e+05,
...
)
stat_spatraster(
mapping = aes(),
data,
geom = "raster",
na.rm = TRUE,
show.legend = NA,
inherit.aes = FALSE,
maxcell = 5e+05,
...
)
mapping |
Set of aesthetic mappings created by |
data |
A SpatRaster object. |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
interpolate |
If |
maxcell |
positive integer. Maximum number of cells to use for the plot. |
... |
Other arguments passed on to |
geom |
The geometric object to use display the data. Recommended |
A ggplot2 layer
When the SpatRaster does not present a crs (i.e.,
terra::crs(rast) == ""
) the geom does not make any assumption on the
scales.
On SpatRaster that have a crs, the geom uses ggplot2::coord_sf()
to adjust
the scales. That means that also the SpatRaster may be reprojected.
geom_spatraster()
understands the following aesthetics:
fill
alpha
If fill
is not provided, geom_spatraster()
creates a ggplot2 layer with
all the layers of the SpatRaster object. Use facet_wrap(~lyr)
to display
properly the SpatRaster layers.
If fill
is used, it should contain the name of one layer that is present
on the SpatRaster (i.e.
geom_spatraster(data = rast, aes(fill = <name_of_lyr>)
). Names of the
layers can be retrieved using names(rast)
.
Using geom_spatraster(..., mapping = aes(fill = NULL))
or
geom_spatraster(..., fill = <color value(s)>)
would create a layer with no
mapped fill
aesthetic.
fill
can use computed variables.
For alpha
use computed variable. See section Computed variables.
stat_spatraster()
understands the same aesthetics than geom_spatraster()
when using geom = "raster"
(the default):
fill
alpha
When geom = "raster"
the fill
parameter would behave as in
geom_spatraster()
. If another geom
is used stat_spatraster()
would
understand the aesthetics of the required geom
and
aes(fill = <name_of_lyr>)
would not be applicable.
Note also that mapping of aesthetics x
and y
is provided by default,
so the user does not need to add those aesthetics on aes()
. In all the
cases the aesthetics should be mapped by using computed variables. See
section Computed variables and Examples.
You can use facet_wrap(~lyr)
for creating a faceted plot by each layer of
the SpatRaster object. See ggplot2::facet_wrap()
for details.
This geom computes internally some variables that are available for use as
aesthetics, using (for example) aes(alpha = after_stat(value))
(see
ggplot2::after_stat()
).
value
Values of the SpatRaster.
lyr
Name of the layer.
Based on the layer_spatial()
implementation on ggspatial package.
Thanks to Dewey Dunnington and
ggspatial contributors.
ggplot2::geom_raster()
, ggplot2::coord_sf()
,
ggplot2::facet_wrap()
Alternative geoms: ggplot2::geom_point()
, ggplot2::geom_label()
,
ggplot2::geom_text()
.
Other ggplot2 utils:
autoplot.Spat
,
fortify.Spat
,
geom_spat_contour
,
geom_spatraster_rgb()
,
ggspatvector
,
stat_spat_coordinates()
# Avg temperature on spring in Castille and Leon (Spain)
file_path <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
library(terra)
temp_rast <- rast(file_path)
library(ggplot2)
# Display a single layer
names(temp_rast)
ggplot() +
geom_spatraster(data = temp_rast, aes(fill = tavg_04)) +
# You can use coord_sf
coord_sf(crs = 3857) +
scale_fill_hypso_c()
# Display facets
ggplot() +
geom_spatraster(data = temp_rast) +
facet_wrap(~lyr, ncol = 2) +
scale_fill_hypso_b()
# Non spatial rasters
no_crs <- rast(crs = NA, extent = c(0, 100, 0, 100), nlyr = 1)
values(no_crs) <- seq_len(ncell(no_crs))
ggplot() +
geom_spatraster(data = no_crs)
# Downsample
ggplot() +
geom_spatraster(data = no_crs, maxcell = 25)
# Using stat_spatraster
# Default
ggplot() +
stat_spatraster(data = temp_rast) +
facet_wrap(~lyr)
# Using points
ggplot() +
stat_spatraster(
data = temp_rast,
aes(color = after_stat(value)),
geom = "point", maxcell = 250
) +
scale_colour_viridis_c(na.value = NA) +
facet_wrap(~lyr)
# Using points and labels
r_single <- temp_rast %>% select(1)
ggplot() +
stat_spatraster(
data = r_single,
aes(color = after_stat(value)),
geom = "point",
maxcell = 2000
) +
stat_spatraster(
data = r_single,
aes(label = after_stat(round(value, 2))),
geom = "label",
alpha = 0.85,
maxcell = 20
) +
scale_colour_viridis_c(na.value = NA)
This geom is used to visualise SpatRaster objects (see terra::rast()
) as
RGB images. The layers are combined such that they represent the red,
green and blue channel.
For plotting SpatRaster objects by layer values use geom_spatraster()
.
The underlying implementation is based on ggplot2::geom_raster()
.
geom_spatraster_rgb(
mapping = aes(),
data,
interpolate = TRUE,
r = 1,
g = 2,
b = 3,
alpha = 1,
maxcell = 5e+05,
max_col_value = 255,
...
)
mapping |
Ignored. |
data |
A SpatRaster object. |
interpolate |
If |
r , g , b
|
Integer representing the number of layer of |
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
maxcell |
positive integer. Maximum number of cells to use for the plot. |
max_col_value |
Number giving the maximum of the color values range.
When this is |
... |
Other arguments passed on to |
A ggplot2 layer
When the SpatRaster does not present a crs (i.e.,
terra::crs(rast) == ""
) the geom does not make any assumption on the
scales.
On SpatRaster that have a crs, the geom uses ggplot2::coord_sf()
to adjust
the scales. That means that also the SpatRaster may be reprojected.
No aes()
is required. In fact, aes()
will be ignored.
Based on the layer_spatial()
implementation on ggspatial package.
Thanks to Dewey Dunnington and
ggspatial contributors.
ggplot2::geom_raster()
, ggplot2::coord_sf()
, grDevices::rgb()
.
You can get also RGB tiles from the maptiles package,
see maptiles::get_tiles()
.
Other ggplot2 utils:
autoplot.Spat
,
fortify.Spat
,
geom_spat_contour
,
geom_spatraster()
,
ggspatvector
,
stat_spat_coordinates()
# Tile of Castille and Leon (Spain) from OpenStreetMap
file_path <- system.file("extdata/cyl_tile.tif", package = "tidyterra")
library(terra)
tile <- rast(file_path)
library(ggplot2)
ggplot() +
geom_spatraster_rgb(data = tile) +
# You can use coord_sf
coord_sf(crs = 3035)
# Combine with sf objects
vect_path <- system.file("extdata/cyl.gpkg", package = "tidyterra")
cyl_sf <- sf::st_read(vect_path)
ggplot(cyl_sf) +
geom_spatraster_rgb(data = tile) +
geom_sf(aes(fill = iso2)) +
coord_sf(crs = 3857) +
scale_fill_viridis_d(alpha = 0.7)
Wrappers of ggplot2::geom_sf()
family used to visualise SpatVector objects
(see terra::vect()
).
geom_spatvector(
mapping = aes(),
data = NULL,
na.rm = FALSE,
show.legend = NA,
...
)
geom_spatvector_label(
mapping = aes(),
data = NULL,
na.rm = FALSE,
show.legend = NA,
...,
nudge_x = 0,
nudge_y = 0,
label.size = 0.25,
inherit.aes = TRUE
)
geom_spatvector_text(
mapping = aes(),
data = NULL,
na.rm = FALSE,
show.legend = NA,
...,
nudge_x = 0,
nudge_y = 0,
check_overlap = FALSE,
inherit.aes = TRUE
)
stat_spatvector(
mapping = NULL,
data = NULL,
geom = "rect",
position = "identity",
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...
)
mapping |
Set of aesthetic mappings created by |
data |
A SpatVector object, see |
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
You can also set this to one of "polygon", "line", and "point" to override the default legend. |
... |
Other arguments passed on to |
nudge_x , nudge_y
|
Horizontal and vertical adjustment to nudge labels by.
Useful for offsetting text from points, particularly on discrete scales.
Cannot be jointly specified with |
label.size |
Size of label border, in mm. |
inherit.aes |
If |
check_overlap |
If |
geom |
The geometric object to use to display the data, either as a
|
position |
Position adjustment, either as a string naming the adjustment
(e.g. |
These functions are wrappers of ggplot2::geom_sf()
functions. Since a
fortify.SpatVector()
method is provided, ggplot2 treat a SpatVector
in the same way that a sf
object. A side effect is that you can use
ggplot2::geom_sf()
directly with SpatVectors.
See ggplot2::geom_sf()
for details on aesthetics, etc.
A ggplot2 layer
Other ggplot2 utils:
autoplot.Spat
,
fortify.Spat
,
geom_spat_contour
,
geom_spatraster_rgb()
,
geom_spatraster()
,
stat_spat_coordinates()
# Create a SpatVector
extfile <- system.file("extdata/cyl.gpkg", package = "tidyterra")
cyl <- terra::vect(extfile)
class(cyl)
library(ggplot2)
ggplot(cyl) +
geom_spatvector()
# With params
ggplot(cyl) +
geom_spatvector(aes(fill = name), color = NA) +
scale_fill_viridis_d() +
coord_sf(crs = 3857)
# Add labels
ggplot(cyl) +
geom_spatvector(aes(fill = name), color = NA) +
geom_spatvector_text(aes(label = iso2),
fontface = "bold",
color = "red"
) +
scale_fill_viridis_d(alpha = 0.4) +
coord_sf(crs = 3857)
# You can use now geom_sf with SpatVectors!
ggplot(cyl) +
geom_sf() +
labs(
title = paste("cyl is", as.character(class(cyl))),
subtitle = "With geom_sf()"
)
glimpse()
is like a transposed version of print()
: layers/columns run
down the page, and data runs across. This makes it possible to see every
layer/column in a Spat* object.
## S3 method for class 'SpatRaster'
glimpse(x, width = NULL, ...)
## S3 method for class 'SpatVector'
glimpse(x, width = NULL, ...)
x |
A SpatRaster created with |
width |
Width of output: defaults to the setting of the
|
... |
Arguments passed on to |
original x
is (invisibly) returned, allowing glimpse()
to
be used within a data pipeline.
print()
Implementation of the generic dplyr::glimpse()
function for
Spat*. objects.
Other dplyr verbs that operate on columns:
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
select.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
# SpatVector
v <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
v %>% glimpse(width = 200)
# Use on a pipeline
v %>%
glimpse() %>%
mutate(a = 30) %>%
# with options
glimpse(geom = "WKT")
# SpatVector
r <- rast(system.file("extdata/cyl_elev.tif", package = "tidyterra"))
r %>% glimpse()
# Use on a pipeline
r %>%
glimpse() %>%
mutate(b = elevation_m / 100) %>%
# With options
glimpse(xy = TRUE)
Most data operations are done on groups defined by variables. group_by()
adds new attributes to an existing SpatVector indicating the
corresponding groups. See Methods.
## S3 method for class 'SpatVector'
group_by(.data, ..., .add = FALSE, .drop = group_by_drop_default(.data))
## S3 method for class 'SpatVector'
ungroup(x, ...)
.data , x
|
A SpatVector object. See Methods. |
... |
In |
.add |
When This argument was previously called |
.drop |
Drop groups formed by factor levels that don't appear in the
data? The default is |
See Details on dplyr::group_by()
.
A SpatVector object with an additional attribute.
Implementation of the generic dplyr::group_by()
family functions for
SpatVectors.
When mixing terra and dplyr syntax on a grouped
SpatVector (i.e, subsetting a SpatVector like v[1:3,1:2]
) the groups
attribute can be corrupted. tidyterra would try to re-group the
SpatVector. This would be triggered the next time you use a dplyr verb on
your SpatVector.
Note also that some operations (as terra::spatSample()
) would create a new
SpatVector. In these cases, the result won't preserve the groups
attribute.
Use group_by.SpatVector()
to re-group.
dplyr::group_by()
, dplyr::ungroup()
Other dplyr verbs that operate on group of rows:
count.SpatVector()
,
rowwise.SpatVector()
,
summarise.SpatVector()
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("ex/lux.shp", package = "terra")
p <- vect(f)
by_name1 <- p %>% group_by(NAME_1)
# grouping doesn't change how the SpatVector looks
by_name1
# But add metadata for grouping: See the coercion to tibble
# Not grouped
p_tbl <- as_tibble(p)
class(p_tbl)
head(p_tbl, 3)
# Grouped
by_name1_tbl <- as_tibble(by_name1)
class(by_name1_tbl)
head(by_name1_tbl, 3)
# It changes how it acts with the other dplyr verbs:
by_name1 %>% summarise(
pop = mean(POP),
area = sum(AREA)
)
# Each call to summarise() removes a layer of grouping
by_name2_name1 <- p %>% group_by(NAME_2, NAME_1)
by_name2_name1
group_data(by_name2_name1)
by_name2 <- by_name2_name1 %>% summarise(n = dplyr::n())
by_name2
group_data(by_name2)
# To removing grouping, use ungroup
by_name2 %>%
ungroup() %>%
summarise(n = sum(n))
# By default, group_by() overrides existing grouping
by_name2_name1 %>%
group_by(ID_1, ID_2) %>%
group_vars()
# Use add = TRUE to instead append
by_name2_name1 %>%
group_by(ID_1, ID_2, .add = TRUE) %>%
group_vars()
# You can group by expressions: this is a short-hand
# for a mutate() followed by a group_by()
p %>%
group_by(ID_COMB = ID_1 * 100 / ID_2) %>%
relocate(ID_COMB, .before = 1)
A tibble including the color map of
33 gradient palettes. All the
palettes includes also a definition of colors limits in terms of elevation
(meters), that can be used with ggplot2::scale_fill_gradientn()
.
A tibble of 1102 rows and 6 columns. with the following fields:
pal: Name of the palette.
limit: Recommended elevation limit (in meters) for each color.
r,g,b: Value of the red, green and blue channel (RGB color mode).
hex: Hex code of the color.
cpt-city: http://soliton.vm.bytemark.co.uk/pub/cpt-city/.
Other datasets:
cross_blended_hypsometric_tints_db
,
volcano2
data("hypsometric_tints_db")
hypsometric_tints_db
# Select a palette
wikicols <- hypsometric_tints_db %>%
filter(pal == "wiki-2.0")
f <- system.file("extdata/asia.tif", package = "tidyterra")
r <- terra::rast(f)
library(ggplot2)
p <- ggplot() +
geom_spatraster(data = r) +
labs(fill = "elevation")
p +
scale_fill_gradientn(colors = wikicols$hex)
# Use with limits
p +
scale_fill_gradientn(
colors = wikicols$hex,
values = scales::rescale(wikicols$limit),
limit = range(wikicols$limit)
)
Assess if the coordinates x,y of an object conforms a regular grid. This function is called by its side effects.
This function is internally called by as_spatraster()
.
is_regular_grid(xy, digits = 6)
xy |
A matrix, data frame or tibble of at least two columns representing x and y coordinates. |
digits |
integer to set the precision for detecting whether points are on a regular grid (a low number of digits is a low precision). |
invisible()
if is regular or an error message otherwise
Other helpers:
compare_spatrasters()
,
is_grouped_spatvector()
,
pull_crs()
p <- matrix(1:90, nrow = 45, ncol = 2)
is_regular_grid(p)
# Jitter location
set.seed(1234)
jitter <- runif(length(p)) / 10e4
p_jitter <- p + jitter
# Need to adjust digits
is_regular_grid(p_jitter, digits = 4)
Mutating joins add columns from y
to x
, matching observations based on
the keys. There are four mutating joins: the inner join, and the three outer
joins.
See dplyr::inner_join()
for details.
## S3 method for class 'SpatVector'
inner_join(
x,
y,
by = NULL,
copy = FALSE,
suffix = c(".x", ".y"),
...,
keep = NULL
)
## S3 method for class 'SpatVector'
left_join(
x,
y,
by = NULL,
copy = FALSE,
suffix = c(".x", ".y"),
...,
keep = NULL
)
## S3 method for class 'SpatVector'
right_join(
x,
y,
by = NULL,
copy = FALSE,
suffix = c(".x", ".y"),
...,
keep = NULL
)
## S3 method for class 'SpatVector'
full_join(
x,
y,
by = NULL,
copy = FALSE,
suffix = c(".x", ".y"),
...,
keep = NULL
)
x |
A SpatVector created with |
y |
A data frame or other object coercible to a data frame. If a
SpatVector of sf object is provided it would return an error (see
|
by |
A join specification created with If To join on different variables between To join by multiple variables, use a
For simple equality joins, you can alternatively specify a character vector
of variable names to join by. For example, To perform a cross-join, generating all combinations of |
copy |
If |
suffix |
If there are non-joined duplicate variables in |
... |
Other parameters passed onto methods. |
keep |
Should the join keys from both
|
A SpatVector object.
Implementation of the generic dplyr::inner_join()
family
The geometry column has a sticky behavior. This means that the result would
have always the geometry of x
for the records that matches the join
conditions.
Note that for right_join()
and full_join()
it is possible to return
empty geometries (since y
is expected to be a data frame with no
geometries). Although this kind of joining operations may not be common on
spatial manipulation, it is possible that the function crashes, since
handling of EMPTY
geometries differs on terra and sf (the
backend of *_join.SpatVector()
is the implementation made on sf).
dplyr::inner_join()
, dplyr::left_join()
, dplyr::right_join()
,
dplyr::full_join()
, terra::merge()
Other dplyr verbs that operate on pairs Spat*/data.frame:
bind_cols.SpatVector
,
bind_rows.SpatVector
,
filter-joins.SpatVector
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
library(ggplot2)
# Vector
v <- terra::vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
# A data frame
df <- data.frame(
cpro = sprintf("%02d", 1:10),
x = runif(10),
y = runif(10),
letter = rep_len(LETTERS[1:3], length.out = 10)
)
# Inner join
inner <- v %>% inner_join(df)
nrow(inner)
autoplot(inner, aes(fill = letter)) + ggtitle("Inner Join")
# Left join
left <- v %>% left_join(df)
nrow(left)
autoplot(left, aes(fill = letter)) + ggtitle("Left Join")
# Right join
right <- v %>% right_join(df)
nrow(right)
autoplot(right, aes(fill = letter)) + ggtitle("Right Join")
# There are empty geometries, check with data from df
ggplot(right, aes(x, y)) +
geom_point(aes(color = letter))
# Full join
full <- v %>% full_join(df)
nrow(full)
autoplot(full, aes(fill = letter)) + ggtitle("Full Join")
# Check with data from df
ggplot(full, aes(x, y)) +
geom_point(aes(color = letter))
mutate()
adds new layers/attributes and preserves existing ones on a
Spat* object. transmute()
adds new layers/attributes and drops existing
ones. New variables overwrite existing variables of the same name. Variables
can be removed by setting their value to NULL
.
## S3 method for class 'SpatRaster'
mutate(.data, ...)
## S3 method for class 'SpatVector'
mutate(.data, ...)
## S3 method for class 'SpatRaster'
transmute(.data, ...)
## S3 method for class 'SpatVector'
transmute(.data, ...)
.data |
A SpatRaster created with |
... |
|
A Spat* object of the same class than .data
. See Methods.
Some terra methods for modifying cell values:
terra::ifel()
, terra::classify()
, terra::clamp()
, terra::app()
,
terra::lapp()
, terra::tapp()
Implementation of the generics dplyr::mutate()
, dplyr::transmute()
functions.
Add new layers and preserves existing ones. The result is a
SpatRaster with the same extent, resolution and crs than .data
. Only the
values (and possibly the number) of layers is modified.
transmute()
would keep only the layers created with ...
.
The result is a SpatVector with the modified (and possibly renamed) attributes on the function call.
transmute()
would keep only the attributes created with ...
.
dplyr::mutate()
, dplyr::transmute()
Other single table verbs:
arrange.SpatVector()
,
filter.Spat
,
rename.Spat
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on columns:
glimpse.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
select.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
# SpatRaster method
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
spatrast <- rast(f)
mod <- spatrast %>%
mutate(exp_lyr1 = exp(tavg_04 / 10)) %>%
select(tavg_04, exp_lyr1)
mod
plot(mod)
# SpatVector method
f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
v <- vect(f)
v %>%
mutate(cpro2 = paste0(cpro, "-CyL")) %>%
select(cpro, cpro2)
Extract the WKT version of the CRS associated to a string, number of sf/Spat* object.
The Well-known text (WKT) representation of coordinate reference systems (CRS) is a character string that identifies precisely the parameters of each CRS. This is the current standard used on sf and terra packages.
pull_crs(.data, ...)
.data |
Input potentially including or representing a CRS. It could be
a |
... |
ignored |
Although the WKT representation is the same, sf and terra slightly differs. For example, a sf user could do:
sf::st_transform(x, 25830)
While a terra user needs to:
terra::project(bb, "epsg:25830")
Knowing the WKT would help to smooth workflows when working with different packages and object types.
A WKT representation of the corresponding CRS.
This is a thin wrapper of sf::st_crs()
and terra::crs()
.
Other helpers:
compare_spatrasters()
,
is_grouped_spatvector()
,
is_regular_grid()
# sf objects
sfobj <- sf::st_as_sfc("MULTIPOINT ((0 0), (1 1))", crs = 4326)
fromsf1 <- pull_crs(sfobj)
fromsf2 <- pull_crs(sf::st_crs(sfobj))
# terra
v <- terra::vect(sfobj)
r <- terra::rast(v)
fromterra1 <- pull_crs(v)
fromterra2 <- pull_crs(r)
# integers
fromint <- pull_crs(4326)
# Characters
fromchar <- pull_crs("epsg:4326")
all(
fromsf1 == fromsf2,
fromsf2 == fromterra1,
fromterra1 == fromterra2,
fromterra2 == fromint,
fromint == fromchar
)
cat(fromsf1)
pull()
is similar to $ on a data frame. It's mostly useful because it
looks a little nicer in pipes and it can optionally name the output.
It is possible to extract the geographic coordinates of a SpatRaster.
You need to use pull(.data, x, xy = TRUE)
. x
and y
are reserved
names on terra, since they refer to the geographic coordinates of the layer.
See Examples and section About layer names
on as_tibble()
.
## S3 method for class 'SpatRaster'
pull(.data, var = -1, name = NULL, ...)
## S3 method for class 'SpatVector'
pull(.data, var = -1, name = NULL, ...)
.data |
A SpatRaster created with |
var |
A variable specified as:
The default returns the last layer/attribute (on the assumption that's the column you've created most recently). |
name |
An optional parameter that specifies the column to be used as
names for a named vector. Specified in a similar manner as |
... |
Arguments passed on to |
A vector the same number of cells/geometries as .data
.
On SpatRasters, note that the default (na.rm = FALSE
) would remove
empty cells, so you may need to pass (na.rm = FALSE
) to ...
. See
terra::as.data.frame()
.
Implementation of the generic dplyr::pull()
function. This is done
by coercing the Spat* object to a tibble first (see as_tibble.Spat) and
then using dplyr::pull()
method over the tibble.
When passing option na.rm = TRUE
to ...
, only cells with a value
distinct to NA
are extracted. See terra::as.data.frame()
.
If xy = TRUE
option is passed to ...
, two columns names x
and y
(corresponding to the geographic coordinates of each cell) are available
in position 1
and 2
. Hence, pull(.data, 1)
and
pull(.data, 1, xy = TRUE)
return different result.
When passing geom = "WKT"/geom = "HEX"
to ...
, the geometry of the
SpatVector can be pulled passing var = geometry
. Similarly to SpatRaster
method, when using geom = "XY"
the x,y
coordinates can be pulled with
var = x/var = y
. See terra::as.data.frame()
options.
Other dplyr verbs that operate on columns:
glimpse.Spat
,
mutate.Spat
,
relocate.Spat
,
rename.Spat
,
select.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("extdata/cyl_tile.tif", package = "tidyterra")
r <- rast(f)
# Extract second layer
r %>%
pull(2) %>%
head()
# With xy the first two cols are `x` (longitude) and `y` (latitude)
r %>%
pull(2, xy = TRUE) %>%
head()
# With renaming
r %>%
mutate(cat = cut(cyl_tile_3, c(0, 100, 300))) %>%
pull(cyl_tile_3, name = cat) %>%
head()
Use relocate()
to change layer/attribute positions, using the same syntax
as select()
to make it easy to move blocks of layers/attributes at once.
## S3 method for class 'SpatRaster'
relocate(.data, ..., .before = NULL, .after = NULL)
## S3 method for class 'SpatVector'
relocate(.data, ..., .before = NULL, .after = NULL)
.data |
A SpatRaster created with |
... |
|
.before , .after
|
|
A Spat* object of the same class than .data
. See Methods.
terra::subset(data, c("name_layer", "name_other_layer"))
Implementation of the generic dplyr::relocate()
function.
Relocate layers of a SpatRaster.
The result is a SpatVector with the attributes on a different order.
Other dplyr verbs that operate on columns:
glimpse.Spat
,
mutate.Spat
,
pull.Spat
,
rename.Spat
,
select.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("extdata/cyl_tile.tif", package = "tidyterra")
spatrast <- rast(f) %>% mutate(aa = 1, bb = 2, cc = 3)
names(spatrast)
spatrast %>%
relocate(bb, .before = cyl_tile_3) %>%
relocate(cyl_tile_1, .after = last_col())
rename()
changes the names of individual layers/attributes using
new_name = old_name
syntax; rename_with()
renames layers/attributes
using a function.
## S3 method for class 'SpatRaster'
rename(.data, ...)
## S3 method for class 'SpatRaster'
rename_with(.data, .fn, .cols = everything(), ...)
## S3 method for class 'SpatVector'
rename(.data, ...)
## S3 method for class 'SpatVector'
rename_with(.data, .fn, .cols = everything(), ...)
.data |
A SpatRaster created with |
... |
For For |
.fn |
A function used to transform the selected |
.cols |
|
A Spat* object of the same class than .data
. See Methods.
names(Spat*) <- c("a", "b", "c")
Implementation of the generic dplyr::rename()
function.
Rename layers of a SpatRaster.
The result is a SpatVector with the renamed attributes on the function call.
Other single table verbs:
arrange.SpatVector()
,
filter.Spat
,
mutate.Spat
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on columns:
glimpse.Spat
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
select.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("extdata/cyl_tile.tif", package = "tidyterra")
spatrast <- rast(f) %>% mutate(aa = 1, bb = 2, cc = 3)
spatrast
spatrast %>% rename(
this_first = cyl_tile_1,
this_second = cyl_tile_2
)
spatrast %>% rename_with(
toupper,
.cols = starts_with("c")
)
Replace NAs
on layers/attributes with specified values
## S3 method for class 'SpatRaster'
replace_na(data, replace = list(), ...)
## S3 method for class 'SpatVector'
replace_na(data, replace, ...)
data |
A SpatRaster created with |
replace |
list of values, with one value for each layer/attribute that
has |
... |
Ignored |
A Spat* object of the same class than data
. Geometries and
spatial attributes are preserved.
Use r[is.na(r)] <- <replacement>
Other tidyr.methods:
drop_na.SpatVector()
library(terra)
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
r <- rast(f)
r %>% plot()
r %>%
replace_na(list(tavg_04 = 6, tavg_06 = 20)) %>%
plot()
rowwise()
allows you to compute on a SpatVector a row-at-a-time.
This is most useful when a vectorised function doesn't exist.
Most dplyr verbs implementation in tidyterra preserve row-wise
grouping, with the exception of summarise.SpatVector()
. You can explicitly
ungroup with ungroup.SpatVector()
or as_tibble()
, or convert to a
grouped SpatVector with group_by.SpatVector()
.
## S3 method for class 'SpatVector'
rowwise(data, ...)
data |
A SpatVector object. See Methods. |
... |
< |
See Details on dplyr::rowwise()
.
A SpatVector object with an additional attribute.
Implementation of the generic dplyr::rowwise()
function for
SpatVectors.
When mixing terra and dplyr syntax on a row-wise
SpatVector (i.e, subsetting a SpatVector like v[1:3,1:2]
) the groups
attribute can be corrupted. tidyterra would try to re-generate the
SpatVector. This would be triggered the next time you use a dplyr verb on
your SpatVector.
Note also that some operations (as terra::spatSample()
) would create a new
SpatVector. In these cases, the result won't preserve the groups
attribute.
Use rowwise.SpatVector()
to re-group.
Other dplyr verbs that operate on group of rows:
count.SpatVector()
,
group-by.SpatVector
,
summarise.SpatVector()
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
select.Spat
,
slice.Spat
,
summarise.SpatVector()
library(terra)
library(dplyr)
v <- terra::vect(system.file("shape/nc.shp", package = "sf"))
# Select new births
nb <- v %>%
select(starts_with("NWBIR")) %>%
glimpse()
# Compute the mean of NWBIR on each geometry
nb %>%
rowwise() %>%
mutate(nb_mean = mean(c(NWBIR74, NWBIR79)))
# use c_across() to more easily select many variables
nb %>%
rowwise() %>%
mutate(m = mean(c_across(NWBIR74:NWBIR79)))
# Compute the minimum of x and y in each row
nb %>%
rowwise() %>%
mutate(min = min(c_across(NWBIR74:NWBIR79)))
# Summarising
v %>%
rowwise() %>%
summarise(mean_bir = mean(BIR74, BIR79)) %>%
glimpse() %>%
autoplot(aes(fill = mean_bir))
# Supply a variable to be kept
v %>%
mutate(id2 = as.integer(CNTY_ID / 100)) %>%
rowwise(id2) %>%
summarise(mean_bir = mean(BIR74, BIR79)) %>%
glimpse() %>%
autoplot(aes(fill = as.factor(id2)))
Implementation of the cross blended hypsometric gradients presented on doi:10.14714/CP69.20. The following fill scales and palettes are provided:
scale_*_cross_blended_d()
: For discrete values.
scale_*_cross_blended_c()
: For continuous values.
scale_*_cross_blended_b()
: For binning continuous values.
cross_blended.colors()
: A gradient color palette. See also
grDevices::terrain.colors()
for details.
An additional set of scales is provided. These scales can act as hypsometric (or bathymetric) tints.
scale_*_cross_blended_tint_d()
: For discrete values.
scale_*_cross_blended_tint_c()
: For continuous values.
scale_*_cross_blended_tint_b()
: For binning continuous values.
cross_blended.colors2()
: A gradient color palette. See also
grDevices::terrain.colors()
for details.
See Details.
Additional parameters ...
would be passed on to:
Discrete values: ggplot2::discrete_scale()
Continuous values: ggplot2::continuous_scale()
Binned continuous values: ggplot2::binned_scale()
.
Note that tidyterra just documents a selection of these additional parameters, check the previous links to see the full range of parameters accepted by these scales.
scale_fill_cross_blended_d(
palette = "cold_humid",
...,
alpha = 1,
direction = 1
)
scale_colour_cross_blended_d(
palette = "cold_humid",
...,
alpha = 1,
direction = 1
)
scale_fill_cross_blended_c(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_colour_cross_blended_c(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_fill_cross_blended_b(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
scale_colour_cross_blended_b(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
cross_blended.colors(n, palette = "cold_humid", alpha = 1, rev = FALSE)
scale_fill_cross_blended_tint_d(
palette = "cold_humid",
...,
alpha = 1,
direction = 1
)
scale_colour_cross_blended_tint_d(
palette = "cold_humid",
...,
alpha = 1,
direction = 1
)
scale_fill_cross_blended_tint_c(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "colourbar"
)
scale_colour_cross_blended_tint_c(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "colourbar"
)
scale_fill_cross_blended_tint_b(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "coloursteps"
)
scale_colour_cross_blended_tint_b(
palette = "cold_humid",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "coloursteps"
)
cross_blended.colors2(n, palette = "cold_humid", alpha = 1, rev = FALSE)
palette |
A valid palette name. The name is matched to the list of
available palettes, ignoring upper vs. lower case. See
cross_blended_hypsometric_tints_db for more info. Values available are:
|
... |
Arguments passed on to
|
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
direction |
Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed. |
na.value |
Missing values will be replaced with this value. |
guide |
A function used to create a guide or its name. See
|
n |
the number of colors ( |
rev |
logical indicating whether the ordering of the colors should be reversed. |
values |
if colours should not be evenly positioned along the gradient
this vector gives the position (between 0 and 1) for each colour in the
|
limits |
One of:
|
On scale_*_cross_blended_tint_*
palettes, the position of the gradients
and the limits of the palette are redefined. Instead of treating the color
palette as a continuous gradient, they are rescaled to act as a hypsometric
tint. A rough description of these tints are:
Blue colors: Negative values.
Green colors: 0 to 1.000 values.
Browns: 1000 to 4.000 values.
Whites: Values higher than 4.000.
The following orientation would vary depending on the palette definition (see cross_blended_hypsometric_tints_db for an example on how this could be achieved).
Note that the setup of the palette may not be always suitable for your
specific data. For example, raster of small parts of the globe (and with a
limited range of elevations) may not be well represented. As an example, a
raster with a range of values on [100, 200]
would appear almost as an
uniform color.
This could be adjusted using the limits
/values
provided by ggplot2.
cross_blended.colors2()
provides a gradient color palette where the
distance between colors is different depending of the type of color.
In contrast, cross_blended.colors()
provides an uniform gradient across
colors. See Examples.
The corresponding ggplot2 layer with the values applied to the
fill/colour
aesthetics.
Patterson, T., & Jenny, B. (2011). The Development and Rationale of Cross-blended Hypsometric Tints. Cartographic Perspectives, (69), 31 - 46. doi:10.14714/CP69.20.
Patterson, T. (2004). Using Cross-blended Hypsometric Tints for Generalized Environmental Mapping. Accessed June 10, 2022. http://www.shadedrelief.com/hypso/hypso.html
cross_blended_hypsometric_tints_db, terra::plot()
,
terra::minmax()
, ggplot2::scale_fill_viridis_c()
.
See also ggplot2 docs on additional ...
parameters:
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Other gradient scales and palettes for hypsometry:
scale_hypso
,
scale_terrain
,
scale_whitebox
,
scale_wiki
filepath <- system.file("extdata/volcano2.tif", package = "tidyterra")
library(terra)
volcano2_rast <- rast(filepath)
# Palette
plot(volcano2_rast, col = cross_blended.colors(100, palette = "arid"))
# Palette with uneven colors
plot(volcano2_rast, col = cross_blended.colors2(100, palette = "arid"))
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_cross_blended_c(palette = "cold_humid")
# Use hypsometric tint version...
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_cross_blended_tint_c(palette = "cold_humid")
# ...but not suitable for the range of the raster: adjust
my_lims <- minmax(volcano2_rast) %>% as.integer() + c(-2, 2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_cross_blended_tint_c(
palette = "cold_humid",
limits = my_lims
)
# Full map with true tints
f_asia <- system.file("extdata/asia.tif", package = "tidyterra")
asia <- rast(f_asia)
ggplot() +
geom_spatraster(data = asia) +
scale_fill_cross_blended_tint_c(
palette = "warm_humid",
labels = scales::label_number(),
breaks = c(-10000, 0, 5000, 8000),
guide = guide_colorbar(
direction = "horizontal",
title.position = "top",
barwidth = 25
)
) +
labs(fill = "elevation (m)") +
theme_minimal() +
theme(legend.position = "bottom")
# Binned
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_cross_blended_b(breaks = seq(70, 200, 25), palette = "arid")
# With limits and breaks
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_cross_blended_tint_b(
breaks = seq(75, 200, 25),
palette = "arid",
limits = my_lims
)
# With discrete values
factor <- volcano2_rast %>%
mutate(cats = cut(elevation,
breaks = c(100, 120, 130, 150, 170, 200),
labels = c(
"Very Low", "Low", "Average", "High",
"Very High"
)
))
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_cross_blended_d(na.value = "gray10", palette = "cold_humid")
# Tint version
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_cross_blended_tint_d(
na.value = "gray10",
palette = "cold_humid"
)
# Display all the cross-blended palettes
pals <- unique(cross_blended_hypsometric_tints_db$pal)
# Helper fun for plotting
ncols <- 128
rowcol <- grDevices::n2mfrow(length(pals))
opar <- par(no.readonly = TRUE)
par(mfrow = rowcol, mar = rep(1, 4))
for (i in pals) {
image(
x = seq(1, ncols), y = 1, z = as.matrix(seq(1, ncols)),
col = cross_blended.colors(ncols, i), main = i,
ylab = "", xaxt = "n", yaxt = "n", bty = "n"
)
}
par(opar)
# Display all the cross-blended palettes on version 2
pals <- unique(cross_blended_hypsometric_tints_db$pal)
# Helper fun for plotting
ncols <- 128
rowcol <- grDevices::n2mfrow(length(pals))
opar <- par(no.readonly = TRUE)
par(mfrow = rowcol, mar = rep(1, 4))
for (i in pals) {
image(
x = seq(1, ncols), y = 1, z = as.matrix(seq(1, ncols)),
col = cross_blended.colors2(ncols, i), main = i,
ylab = "", xaxt = "n", yaxt = "n", bty = "n"
)
}
par(opar)
Implementation of a selection of gradient palettes available in cpt-city.
The following scales and palettes are provided:
scale_*_hypso_d()
: For discrete values.
scale_*_hypso_c()
: For continuous values.
scale_*_hypso_b()
: For binning continuous values.
hypso.colors()
: A gradient color palette. See also
grDevices::terrain.colors()
for details.
An additional set of scales is provided. These scales can act as hypsometric (or bathymetric) tints.
scale_*_hypso_tint_d()
: For discrete values.
scale_*_hypso_tint_c()
: For continuous values.
scale_*_hypso_tint_b()
: For binning continuous values.
hypso.colors2()
: A gradient color palette. See also
grDevices::terrain.colors()
for details.
See Details.
Additional parameters ...
would be passed on to:
Discrete values: ggplot2::discrete_scale()
Continuous values: ggplot2::continuous_scale()
Binned continuous values: ggplot2::binned_scale()
.
Note that tidyterra just documents a selection of these additional parameters, check the previous links to see the full range of parameters accepted by these scales.
scale_fill_hypso_d(palette = "etopo1_hypso", ..., alpha = 1, direction = 1)
scale_colour_hypso_d(palette = "etopo1_hypso", ..., alpha = 1, direction = 1)
scale_fill_hypso_c(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_colour_hypso_c(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_fill_hypso_b(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
scale_colour_hypso_b(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
hypso.colors(n, palette = "etopo1_hypso", alpha = 1, rev = FALSE)
scale_fill_hypso_tint_d(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1
)
scale_colour_hypso_tint_d(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1
)
scale_fill_hypso_tint_c(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "colourbar"
)
scale_colour_hypso_tint_c(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "colourbar"
)
scale_fill_hypso_tint_b(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "coloursteps"
)
scale_colour_hypso_tint_b(
palette = "etopo1_hypso",
...,
alpha = 1,
direction = 1,
values = NULL,
limits = NULL,
na.value = NA,
guide = "coloursteps"
)
hypso.colors2(n, palette = "etopo1_hypso", alpha = 1, rev = FALSE)
palette |
A valid palette name. The name is matched to the list of
available palettes, ignoring upper vs. lower case. See
hypsometric_tints_db for more info. Values available are:
|
... |
Arguments passed on to
|
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
direction |
Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed. |
na.value |
Missing values will be replaced with this value. |
guide |
A function used to create a guide or its name. See
|
n |
the number of colors ( |
rev |
logical indicating whether the ordering of the colors should be reversed. |
values |
if colours should not be evenly positioned along the gradient
this vector gives the position (between 0 and 1) for each colour in the
|
limits |
One of:
|
On scale_*_hypso_tint_*
palettes, the position of the gradients and
the limits of the palette are redefined. Instead of treating the color
palette as a continuous gradient, they are rescaled to act as a hypsometric
tint. A rough description of these tints are:
Blue colors: Negative values.
Green colors: 0 to 1.000 values.
Browns: 1000 to 4.000 values.
Whites: Values higher than 4.000.
The following orientation would vary depending on the palette definition (see hypsometric_tints_db for an example on how this could be achieved).
Note that the setup of the palette may not be always suitable for your
specific data. For example, raster of small parts of the globe (and with a
limited range of elevations) may not be well represented. As an example, a
raster with a range of values on [100, 200]
would appear almost as an
uniform color.
This could be adjusted using the limits
/values
provided by ggplot2.
hypso.colors2()
provides a gradient color palette where the distance
between colors is different depending of the type of color. In contrast,
hypso.colors()
provides an uniform gradient across colors.
See Examples.
The corresponding ggplot2 layer with the values applied to the
fill/colour
aesthetics.
cpt-city: http://soliton.vm.bytemark.co.uk/pub/cpt-city/.
hypsometric_tints_db, terra::plot()
, terra::minmax()
,
ggplot2::scale_fill_viridis_c()
See also ggplot2 docs on additional ...
parameters:
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Other gradient scales and palettes for hypsometry:
scale_cross_blended
,
scale_terrain
,
scale_whitebox
,
scale_wiki
filepath <- system.file("extdata/volcano2.tif", package = "tidyterra")
library(terra)
volcano2_rast <- rast(filepath)
# Palette
plot(volcano2_rast, col = hypso.colors(100, palette = "wiki-2.0_hypso"))
# Palette with uneven colors
plot(volcano2_rast, col = hypso.colors2(100, palette = "wiki-2.0_hypso"))
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_hypso_c(palette = "colombia_hypso")
# Use hypsometric tint version...
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_hypso_tint_c(palette = "colombia_hypso")
# ...but not suitable for the range of the raster: adjust
my_lims <- minmax(volcano2_rast) %>% as.integer() + c(-2, 2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_hypso_tint_c(
palette = "colombia_hypso",
limits = my_lims
)
# Full map with true tints
f_asia <- system.file("extdata/asia.tif", package = "tidyterra")
asia <- rast(f_asia)
ggplot() +
geom_spatraster(data = asia) +
scale_fill_hypso_tint_c(
palette = "etopo1",
labels = scales::label_number(),
breaks = c(-10000, 0, 5000, 8000),
guide = guide_colorbar(
direction = "horizontal",
title.position = "top",
barwidth = 25
)
) +
labs(fill = "elevation (m)") +
theme_minimal() +
theme(legend.position = "bottom")
# Binned
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_hypso_b(breaks = seq(70, 200, 25), palette = "wiki-2.0_hypso")
# With limits and breaks
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_hypso_tint_b(
breaks = seq(75, 200, 25),
palette = "wiki-2.0_hypso",
limits = my_lims
)
# With discrete values
factor <- volcano2_rast %>% mutate(cats = cut(elevation,
breaks = c(100, 120, 130, 150, 170, 200),
labels = c(
"Very Low", "Low", "Average", "High",
"Very High"
)
))
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_hypso_d(na.value = "gray10", palette = "dem_poster")
# Tint version
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_hypso_tint_d(na.value = "gray10", palette = "dem_poster")
# Display all the cpl_city palettes
pals <- unique(hypsometric_tints_db$pal)
# Helper fun for plotting
ncols <- 128
rowcol <- grDevices::n2mfrow(length(pals))
opar <- par(no.readonly = TRUE)
par(mfrow = rowcol, mar = rep(1, 4))
for (i in pals) {
image(
x = seq(1, ncols), y = 1, z = as.matrix(seq(1, ncols)),
col = hypso.colors(ncols, i), main = i,
ylab = "", xaxt = "n", yaxt = "n", bty = "n"
)
}
par(opar)
# Display all the cpl_city palettes on version 2
pals <- unique(hypsometric_tints_db$pal)
# Helper fun for plotting
ncols <- 128
rowcol <- grDevices::n2mfrow(length(pals))
opar <- par(no.readonly = TRUE)
par(mfrow = rowcol, mar = rep(1, 4))
for (i in pals) {
image(
x = seq(1, ncols), y = 1, z = as.matrix(seq(1, ncols)),
col = hypso.colors2(ncols, i), main = i,
ylab = "", xaxt = "n", yaxt = "n", bty = "n"
)
}
par(opar)
Implementation of the classic color palettes used by default by the
terra package (see terra::plot()
):
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Additional parameters ...
would be passed on to:
Discrete values: ggplot2::discrete_scale()
Continuous values: ggplot2::continuous_scale()
Binned continuous values: ggplot2::binned_scale()
.
Note that tidyterra just documents a selection of these additional parameters, check the previous links to see the full range of parameters accepted by these scales.
scale_fill_terrain_d(..., alpha = 1, direction = 1)
scale_colour_terrain_d(..., alpha = 1, direction = 1)
scale_fill_terrain_c(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_colour_terrain_c(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_fill_terrain_b(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
scale_colour_terrain_b(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
... |
Arguments passed on to
|
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
direction |
Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed. |
na.value |
Missing values will be replaced with this value. |
guide |
A function used to create a guide or its name. See
|
The corresponding ggplot2 layer with the values applied to the
fill/color
aesthetics.
terra::plot()
, ggplot2::scale_fill_viridis_c()
and ggplot2 docs on
additional ...
parameters:
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Other gradient scales and palettes for hypsometry:
scale_cross_blended
,
scale_hypso
,
scale_whitebox
,
scale_wiki
filepath <- system.file("extdata/volcano2.tif", package = "tidyterra")
library(terra)
volcano2_rast <- rast(filepath)
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_terrain_c()
# Binned
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_terrain_b(breaks = seq(70, 200, 10))
# With discrete values
factor <- volcano2_rast %>% mutate(cats = cut(elevation,
breaks = c(100, 120, 130, 150, 170, 200),
labels = c(
"Very Low", "Low", "Average", "High",
"Very High"
)
))
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_terrain_d(na.value = "gray10")
Implementation of the gradient palettes provided by WhiteboxTools. Three scales are provided:
scale_*_whitebox_d()
: For discrete values.
scale_*_whitebox_c()
: For continuous values.
scale_*_whitebox_b()
: For binning continuous values.
Additionally, a color palette whitebox.colors()
is provided. See also
grDevices::terrain.colors()
for details.
Additional parameters ...
would be passed on to:
Discrete values: ggplot2::discrete_scale()
Continuous values: ggplot2::continuous_scale()
Binned continuous values: ggplot2::binned_scale()
.
Note that tidyterra just documents a selection of these additional parameters, check the previous links to see the full range of parameters accepted by these scales.
scale_fill_whitebox_d(palette = "high_relief", ..., alpha = 1, direction = 1)
scale_colour_whitebox_d(palette = "high_relief", ..., alpha = 1, direction = 1)
scale_fill_whitebox_c(
palette = "high_relief",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_colour_whitebox_c(
palette = "high_relief",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_fill_whitebox_b(
palette = "high_relief",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
scale_colour_whitebox_b(
palette = "high_relief",
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
whitebox.colors(n, palette = "high_relief", alpha = 1, rev = FALSE)
palette |
A valid palette name. The name is matched to the list of
available palettes, ignoring upper vs. lower case. Values available are:
|
... |
Arguments passed on to
|
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
direction |
Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed. |
na.value |
Missing values will be replaced with this value. |
guide |
A function used to create a guide or its name. See
|
n |
the number of colors ( |
rev |
logical indicating whether the ordering of the colors should be reversed. |
The corresponding ggplot2 layer with the values applied to the
fill/colour
aesthetics.
https://github.com/jblindsay/whitebox-tools, under MIT License. Copyright (c) 2017-2021 John Lindsay.
terra::plot()
, ggplot2::scale_fill_viridis_c()
See also ggplot2 docs on additional ...
parameters:
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Other gradient scales and palettes for hypsometry:
scale_cross_blended
,
scale_hypso
,
scale_terrain
,
scale_wiki
filepath <- system.file("extdata/volcano2.tif", package = "tidyterra")
library(terra)
volcano2_rast <- rast(filepath)
# Palette
plot(volcano2_rast, col = whitebox.colors(100))
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_whitebox_c()
# Binned
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_whitebox_b(breaks = seq(70, 200, 10), palette = "atlas")
# With discrete values
factor <- volcano2_rast %>% mutate(cats = cut(elevation,
breaks = c(100, 120, 130, 150, 170, 200),
labels = c(
"Very Low", "Low", "Average", "High",
"Very High"
)
))
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_whitebox_d(na.value = "gray10", palette = "soft")
# Display all the whitebox palettes
pals <- c(
"atlas", "high_relief", "arid", "soft", "muted", "purple",
"viridi", "gn_yl", "pi_y_g", "bl_yl_rd", "deep"
)
# Helper fun for plotting
ncols <- 128
rowcol <- grDevices::n2mfrow(length(pals))
opar <- par(no.readonly = TRUE)
par(mfrow = rowcol, mar = rep(1, 4))
for (i in pals) {
image(
x = seq(1, ncols), y = 1, z = as.matrix(seq(1, ncols)),
col = whitebox.colors(ncols, i), main = i,
ylab = "", xaxt = "n", yaxt = "n", bty = "n"
)
}
par(opar)
Implementation based on the Wikipedia Colorimetric conventions for topographic maps. Three scales are provided:
scale_*_wiki_d()
: For discrete values.
scale_*_wiki_c()
: For continuous values.
scale_*_wiki_b()
: For binning continuous values.
Additionally, a color palette wiki.colors()
is provided. See also
grDevices::terrain.colors()
for details.
Additional parameters ...
would be passed on to:
Discrete values: ggplot2::discrete_scale()
Continuous values: ggplot2::continuous_scale()
Binned continuous values: ggplot2::binned_scale()
.
Note that tidyterra just documents a selection of these additional parameters, check the previous links to see the full range of parameters accepted by these scales.
scale_fill_wiki_d(..., alpha = 1, direction = 1)
scale_colour_wiki_d(..., alpha = 1, direction = 1)
scale_fill_wiki_c(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_colour_wiki_c(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "colourbar"
)
scale_fill_wiki_b(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
scale_colour_wiki_b(
...,
alpha = 1,
direction = 1,
na.value = NA,
guide = "coloursteps"
)
wiki.colors(n, alpha = 1, rev = FALSE)
... |
Arguments passed on to
|
alpha |
The alpha transparency, a number in [0,1], see argument alpha in
|
direction |
Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed. |
na.value |
Missing values will be replaced with this value. |
guide |
A function used to create a guide or its name. See
|
n |
the number of colors ( |
rev |
logical indicating whether the ordering of the colors should be reversed. |
The corresponding ggplot2 layer with the values applied to the
fill/colour
aesthetics.
terra::plot()
, ggplot2::scale_fill_viridis_c()
See also ggplot2 docs on additional ...
parameters:
scale_*_terrain_d()
: For discrete values.
scale_*_terrain_c()
: For continuous values.
scale_*_terrain_b()
: For binning continuous values.
Other gradient scales and palettes for hypsometry:
scale_cross_blended
,
scale_hypso
,
scale_terrain
,
scale_whitebox
filepath <- system.file("extdata/volcano2.tif", package = "tidyterra")
library(terra)
volcano2_rast <- rast(filepath)
# Palette
plot(volcano2_rast, col = wiki.colors(100))
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_wiki_c()
# Binned
ggplot() +
geom_spatraster(data = volcano2_rast) +
scale_fill_wiki_b(breaks = seq(70, 200, 10))
# With discrete values
factor <- volcano2_rast %>% mutate(cats = cut(elevation,
breaks = c(100, 120, 130, 150, 170, 200),
labels = c(
"Very Low", "Low", "Average", "High",
"Very High"
)
))
ggplot() +
geom_spatraster(data = factor, aes(fill = cats)) +
scale_fill_wiki_d(na.value = "gray10")
Select (and optionally rename) attributes/layers in Spat* objects, using a concise mini-language. See Methods.
## S3 method for class 'SpatRaster'
select(.data, ...)
## S3 method for class 'SpatVector'
select(.data, ...)
.data |
A SpatRaster created with |
... |
|
A Spat* object of the same class than .data
. See Methods.
Implementation of the generic dplyr::select()
function.
Select (and rename) layers of a SpatRaster. The result is a
SpatRaster with the same extent, resolution and crs than .data
. Only the
number (and possibly the name) of layers is modified.
The result is a SpatVector with the selected (and possibly renamed) attributes on the function call.
dplyr::select()
, terra::subset()
Other single table verbs:
arrange.SpatVector()
,
filter.Spat
,
mutate.Spat
,
rename.Spat
,
slice.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on columns:
glimpse.Spat
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
slice.Spat
,
summarise.SpatVector()
library(terra)
# SpatRaster method
spatrast <- rast(
crs = "EPSG:3857",
nrows = 10,
ncols = 10,
extent = c(100, 200, 100, 200),
nlyr = 6,
vals = seq_len(10 * 10 * 6)
)
spatrast %>% select(1)
# By name
spatrast %>% select(lyr.1:lyr.4)
# Rename
spatrast %>% select(a = lyr.1, c = lyr.6)
# SpatVector method
f <- system.file("extdata/cyl.gpkg", package = "tidyterra")
v <- vect(f)
v
v %>% select(1, 3)
v %>% select(iso2, name2 = cpro)
slice()
lets you index cells/rows/columns/geometries by their (integer)
locations. It allows you to select, remove, and duplicate those dimensions
of a Spat* object.
If you want to slice your SpatRaster by geographic coordinates use
filter.SpatRaster()
method.
It is accompanied by a number of helpers for common use cases:
slice_head()
and slice_tail()
select the first or last
cells/geometries.
slice_sample()
randomly selects cells/geometries.
slice_rows()
and slice_cols()
allow to subset entire rows or columns,
of a SpatRaster.
slice_colrows()
subsets regions of the raster by row and column position
of a SpatRaster.
You can get a skeleton of your SpatRaster with the cell, column and row
index with as_coordinates()
.
See Methods for details.
## S3 method for class 'SpatRaster'
slice(.data, ..., .preserve = FALSE, .keep_extent = FALSE)
## S3 method for class 'SpatVector'
slice(.data, ..., .preserve = FALSE)
## S3 method for class 'SpatRaster'
slice_head(.data, ..., n, prop, .keep_extent = FALSE)
## S3 method for class 'SpatVector'
slice_head(.data, ..., n, prop)
## S3 method for class 'SpatRaster'
slice_tail(.data, ..., n, prop, .keep_extent = FALSE)
## S3 method for class 'SpatVector'
slice_tail(.data, ..., n, prop)
## S3 method for class 'SpatRaster'
slice_min(
.data,
order_by,
...,
n,
prop,
with_ties = TRUE,
.keep_extent = FALSE,
na.rm = TRUE
)
## S3 method for class 'SpatVector'
slice_min(.data, order_by, ..., n, prop, with_ties = TRUE, na_rm = FALSE)
## S3 method for class 'SpatRaster'
slice_max(
.data,
order_by,
...,
n,
prop,
with_ties = TRUE,
.keep_extent = FALSE,
na.rm = TRUE
)
## S3 method for class 'SpatVector'
slice_max(.data, order_by, ..., n, prop, with_ties = TRUE, na_rm = FALSE)
## S3 method for class 'SpatRaster'
slice_sample(
.data,
...,
n,
prop,
weight_by = NULL,
replace = FALSE,
.keep_extent = FALSE
)
## S3 method for class 'SpatVector'
slice_sample(.data, ..., n, prop, weight_by = NULL, replace = FALSE)
slice_rows(.data, ...)
## S3 method for class 'SpatRaster'
slice_rows(.data, ..., .keep_extent = FALSE)
slice_cols(.data, ...)
## S3 method for class 'SpatRaster'
slice_cols(.data, ..., .keep_extent = FALSE)
slice_colrows(.data, ...)
## S3 method for class 'SpatRaster'
slice_colrows(.data, ..., cols, rows, .keep_extent = FALSE, inverse = FALSE)
.data |
A SpatRaster created with |
... |
The values provided must be either all positive or all negative. Indices beyond the number of rows in the input are silently ignored. See Methods. |
.preserve |
Ignored for Spat* objects |
.keep_extent |
Should the extent of the resulting SpatRaster be kept?
See also |
n , prop
|
Provide either A negative value of |
order_by |
< |
with_ties |
Should ties be kept together? The default, |
na.rm |
Logical, should cells that present a value of |
na_rm |
Should missing values in |
weight_by |
< |
replace |
Should sampling be performed with ( |
cols , rows
|
Integer col/row values of the SpatRaster |
inverse |
If |
A Spat* object of the same class than .data
. See Methods.
terra::subset()
, terra::spatSample()
Implementation of the generic dplyr::slice()
function.
The result is a SpatRaster with the crs and resolution of the input and where cell values of the selected cells/columns/rows are preserved.
Use .keep_extent = TRUE
to preserve the extent of .data
on the output.
The non-selected cells would present a value of NA
.
The result is a SpatVector where the attributes of the selected
geometries are preserved. If .data
is a
grouped SpatVector, the operation will be performed
on each group, so that (e.g.) slice_head(df, n = 5)
will select the first
five rows in each group.
dplyr::slice()
, terra::spatSample()
.
You can get a skeleton of your SpatRaster with the cell, column and row
index with as_coordinates()
.
If you want to slice by geographic coordinates use filter.SpatRaster()
.
Other single table verbs:
arrange.SpatVector()
,
filter.Spat
,
mutate.Spat
,
rename.Spat
,
select.Spat
,
summarise.SpatVector()
Other dplyr verbs that operate on rows:
arrange.SpatVector()
,
distinct.SpatVector()
,
filter.Spat
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
summarise.SpatVector()
library(terra)
f <- system.file("extdata/cyl_temp.tif", package = "tidyterra")
r <- rast(f)
# Slice first 100 cells
r %>%
slice(1:100) %>%
plot()
# Rows
r %>%
slice_rows(1:30) %>%
plot()
# Cols
r %>%
slice_cols(-(20:50)) %>%
plot()
# Spatial sample
r %>%
slice_sample(prop = 0.2) %>%
plot()
# Slice regions
r %>%
slice_colrows(
cols = c(20:40, 60:80),
rows = -c(1:20, 30:50)
) %>%
plot()
# Group wise operation with SpatVectors--------------------------------------
v <- terra::vect(system.file("ex/lux.shp", package = "terra"))
glimpse(v) %>% autoplot(aes(fill = NAME_1))
gv <- v %>% group_by(NAME_1)
# All slice helpers operate per group, silently truncating to the group size
gv %>%
slice_head(n = 1) %>%
glimpse() %>%
autoplot(aes(fill = NAME_1))
gv %>%
slice_tail(n = 1) %>%
glimpse() %>%
autoplot(aes(fill = NAME_1))
gv %>%
slice_min(AREA, n = 1) %>%
glimpse() %>%
autoplot(aes(fill = NAME_1))
gv %>%
slice_max(AREA, n = 1) %>%
glimpse() %>%
autoplot(aes(fill = NAME_1))
summarise()
creates a new SpatVector. It returns one geometry for each
combination of grouping variables; if there are no grouping variables, the
output will have a single geometry summarising all observations in the input
and combining all the geometries of the SpatVector. It will contain one
column for each grouping variable and one column for each of
the summary statistics that you have specified.
summarise.SpatVector()
and summarize.SpatVector()
are synonyms
## S3 method for class 'SpatVector'
summarise(.data, ..., .by = NULL, .groups = NULL, .dissolve = TRUE)
## S3 method for class 'SpatVector'
summarize(.data, ..., .by = NULL, .groups = NULL, .dissolve = TRUE)
.data |
A SpatVector |
... |
< The value can be:
|
.by |
|
.groups |
|
.dissolve |
logical. Should borders between aggregated geometries be dissolved? |
A SpatVector.
Implementation of the generic dplyr::summarise()
function.
Similarly to the implementation on sf this function can be used to
dissolve geometries (with .dissolve = TRUE
) or create MULTI
versions of
geometries (with .dissolve = FALSE
). See Examples.
dplyr::summarise()
, terra::aggregate()
Other single table verbs:
arrange.SpatVector()
,
filter.Spat
,
mutate.Spat
,
rename.Spat
,
select.Spat
,
slice.Spat
Other dplyr verbs that operate on group of rows:
count.SpatVector()
,
group-by.SpatVector
,
rowwise.SpatVector()
Other dplyr methods:
arrange.SpatVector()
,
bind_cols.SpatVector
,
bind_rows.SpatVector
,
count.SpatVector()
,
distinct.SpatVector()
,
filter-joins.SpatVector
,
filter.Spat
,
glimpse.Spat
,
group-by.SpatVector
,
mutate-joins.SpatVector
,
mutate.Spat
,
pull.Spat
,
relocate.Spat
,
rename.Spat
,
rowwise.SpatVector()
,
select.Spat
,
slice.Spat
library(terra)
library(ggplot2)
v <- vect(system.file("extdata/cyl.gpkg", package = "tidyterra"))
# Grouped
gr_v <- v %>%
mutate(start_with_s = substr(name, 1, 1) == "S") %>%
group_by(start_with_s)
# Dissolving
diss <- gr_v %>%
summarise(n = dplyr::n(), mean = mean(as.double(cpro)))
diss
autoplot(diss, aes(fill = start_with_s)) + ggplot2::ggtitle("Dissolved")
# Not dissolving
no_diss <- gr_v %>%
summarise(n = dplyr::n(), mean = mean(as.double(cpro)), .dissolve = FALSE)
# Same statistic
no_diss
autoplot(no_diss, aes(fill = start_with_s)) +
ggplot2::ggtitle("Not Dissolved")
Probably you already know the volcano dataset. This dataset provides updated information of Maungawhau (Mt. Eden) from Toitu Te Whenua Land Information New Zealand, the Government's agency that provides free online access to New Zealand’s most up-to-date land and seabed data.
A matrix of 174 rows and 122 columns. Each value is the corresponding altitude in meters.
Information needed for regenerating the original raster file:
resolution: c(5, 5)
extent: 1756969, 1757579, 5917003, 5917873
(xmin, xmax, ymin, ymax)
coord. ref. : NZGD2000 / New Zealand Transverse Mercator 2000
(EPSG:2193
)
DEM for LiDAR data from the Auckland region captured in 2013. The original data has been downsampled to a resolution of 5m due to disk space constrains.
Data License: CC BY 4.0
Other datasets:
cross_blended_hypsometric_tints_db
,
hypsometric_tints_db
data("volcano2")
filled.contour(volcano2, color.palette = hypso.colors, asp = 1)
title(main = "volcano2 data: filled contour map")
# Geo-tag
# Empty raster
volcano2_raster <- terra::rast(volcano2)
terra::crs(volcano2_raster) <- pull_crs(2193)
terra::ext(volcano2_raster) <- c(1756968, 1757576, 5917000, 5917872)
names(volcano2_raster) <- "volcano2"
library(ggplot2)
ggplot() +
geom_spatraster(data = volcano2_raster) +
scale_fill_hypso_c() +
labs(
title = "volcano2 SpatRaster",
subtitle = "Georeferenced",
fill = "Elevation (m)"
)