TERN AusPlots is a national plot-based terrestrial ecosystem surveillance monitoring method and dataset for Australia (Sparrow et al. 2020). Through ausplotsR, users can directly access AusPlots data collected by on-ground observers on vegetation and soils, including physical sample/voucher details and barcode numbers. The dataset can be downloaded in its entirety or as individual modules, and can be subsetted by geographic bounding box or species name search. The package also includes a series of bespoke functions for working with AusPlots data, including visualisation, creating tables of species composition, and calculation of tree basal area, fractional cover or vegetation cover by growth form/structure/strata and so on.
This is a short guide for getting started with analysis of AusPlots data through the ausplotsR R package. More information on making use of AusPlots data in ausplotsR is available through the package help files and manual. Below, we demonstrate installing the package, accessing some AusPlots data, generating matrices and running simple example analyses.
More comprehensive tutorials on accessing and analysing AusPlots data (Blanco-Martin 2019) are available at: https://github.com/ternaustralia/TERN-Data-Skills/tree/master/EcosystemSurveillance_PlotData
The latest version of ausplotsR can be installed
directly from github using the devtools
package, which must
be installed first.
library(devtools)
install_github("ternaustralia/ausplotsR", build_vignettes = TRUE, dependencies = TRUE)
Once installed, load the package as follows. Note, packages vegan, maps and mapdata are required for ausplotsR to load, and functions are also imported from packages: plyr, R.utils, simba, httr, jsonlite, sp, maptools, ggplot2, gtools, jose, curl and betapart, while knitr and rmarkdown are required to build this package vignette (i.e., if ‘build_vignettes’ is set to TRUE above).
library(ausplotsR)
We can now access live data, starting here with basic site
information and vegetation point-intercept modules and using a bounding
box to spatially filter the dataset to central Australia. All data
modules are extracted via a single function,
get_ausplots
:
#See ?get_ausplots to explore all data modules available
<- try(get_ausplots(bounding_box = c(125, 140, -40, -10)))
my.ausplots.data #> calling
#> search
#> status code
#> 200
#> calling
#> site
#> status code
#> 200
#> calling
#> veg_voucher
#> status code
#> 200
#> calling
#> veg_pi
#> status code
#> 200
The output of the above call is a list with the following
$elements
:
names(my.ausplots.data)
#> [1] "site.info" "veg.vouch" "veg.PI" "citation"
The ‘site.info’ table contains basic site and visit details. Here are a selected few of the many fields:
head(my.ausplots.data$site.info[,c("site_location_name", "site_unique", "longitude", "latitude", "bioregion_name")])
#> site_location_name site_unique longitude latitude bioregion_name
#> 1 NTADAC0001 NTADAC0001-53518 130.7779 -13.15835 DAC
#> 2 NTASSD0015 NTASSD0015-53565 135.6168 -25.12393 SSD
#> 3 QDAMII0002 QDAMII0002-53546 138.1606 -20.00789 MII
#> 4 SATSTP0005 SATSTP0005-53513 138.8488 -29.45660 STP
#> 5 SATSTP0005 SATSTP0005-58639 138.8488 -29.45660 STP
#> 6 NTTDAB0001 NTTDAB0001-53580 131.6740 -13.96288 DAB
Each survey is identified by the ‘site_unique’
field, which is unique combination of site ID (‘site_location_name’) and
visit ID (‘site_location_visit_id’). The ‘site_unique’ field
therefore links all tables returned from the get_ausplots
function.
The ‘site.info’ table and can be used to identify, subset or group surveys in space and time, for example:
#count plot visits per Australian States:
summary(as.factor(my.ausplots.data$site.info$state))
#> NT QLD SA WA
#> 184 48 214 33
The package has an in-built function - see
?ausplots_visual
- to rapidly map AusPlots over Australia
and to visualise the relative cover/abundance of green vegetation, plant
growth forms and species. Maps can also be generated manually using the
longitude and latitude fields in the $site.info
table.
#Sites are coded by IBRA bioregion by default.
map_ausplots(my.ausplots.data)
Alternatively, the following call generates a pdf with a map of all
sites and attribute graphics for selected AusPlots:
ausplotsR::ausplots_visual()
Here is a snippet of the raw point-intercept data that will be used in the following examples to derive vegetation attributes:
head(subset(my.ausplots.data$veg.PI, !is.na(herbarium_determination)))
#> site_unique site_location_name site_location_visit_id transect
#> 1 SAASTP0005-53723 SAASTP0005 53723 E2-W2
#> 19 SAASTP0005-53723 SAASTP0005 53723 E2-W2
#> 115 SAASTP0005-53723 SAASTP0005 53723 N2-S2
#> 140 SAASTP0005-53723 SAASTP0005 53723 N2-S2
#> 218 SAASTP0005-53723 SAASTP0005 53723 N4-S4
#> 228 SAASTP0005-53723 SAASTP0005 53723 S1-N1
#> point_number herbarium_determination substrate in_canopy_sky dead
#> 1 61 Pterocaulon sphacelatum Litter FALSE FALSE
#> 19 88 Stemodia florulenta Litter FALSE FALSE
#> 115 33 Pterocaulon sphacelatum Bare FALSE FALSE
#> 140 73 Stemodia florulenta Litter FALSE FALSE
#> 218 90 Erodium carolinianum Bare FALSE FALSE
#> 228 3 Eucalyptus coolabah Bare FALSE FALSE
#> growth_form height veg_barcode standardised_name
#> 1 Forb 0.05 SAA 000357 Pterocaulon sphacelatum
#> 19 Forb 0.02 SAA 000351 Stemodia florulenta
#> 115 Forb 0.03 SAA 000357 Pterocaulon sphacelatum
#> 140 Forb 0.40 SAA 000351 Stemodia florulenta
#> 218 Forb 0.05 SAA 000377 aedo
#> 228 Tree/Palm 0.10 SAA 000425 Eucalyptus coolabah
#> standardised_scientific_name kingdom
#> 1 Pterocaulon sphacelatum (Labill.) Benth. ex F.Muell. Plantae
#> 19 Stemodia florulenta W.R.Barker Plantae
#> 115 Pterocaulon sphacelatum (Labill.) Benth. ex F.Muell. Plantae
#> 140 Stemodia florulenta W.R.Barker Plantae
#> 218 Erodium carolinianum Aldasoro C.Navarro & L.Sáez
#> 228 Eucalyptus coolabah Blakely & Jacobs Plantae
#> taxa_id
#> 1 https://id.biodiversity.org.au/name/apni/227263
#> 19 https://id.biodiversity.org.au/name/apni/227263
#> 115 https://id.biodiversity.org.au/name/apni/227263
#> 140 https://id.biodiversity.org.au/name/apni/227263
#> 218 Aldasoro
#> 228 https://id.biodiversity.org.au/name/apni/227407
#> family genus specific_epithet
#> 1 Asteraceae Pterocaulon sphacelatum
#> 19 Plantaginaceae Stemodia florulenta
#> 115 Asteraceae Pterocaulon sphacelatum
#> 140 Plantaginaceae Stemodia florulenta
#> 218 https://id.biodiversity.org.au/name/apni/90608 Plantae Equisetopsida
#> 228 Myrtaceae Eucalyptus coolabah
#> infraspecific_rank infraspecific_epithet taxa_status taxa_group
#> 1 NA NA accepted Equisetopsida
#> 19 NA NA accepted Equisetopsida
#> 115 NA NA accepted Equisetopsida
#> 140 NA NA accepted Equisetopsida
#> 218 Geraniaceae Erodium carolinianum Erodium carolinianum accepted
#> 228 NA NA accepted Equisetopsida
#> genus_species authorship
#> 1 Pterocaulon sphacelatum (Labill.) Benth. ex F.Muell.
#> 19 Stemodia florulenta W.R.Barker
#> 115 Pterocaulon sphacelatum (Labill.) Benth. ex F.Muell.
#> 140 Stemodia florulenta W.R.Barker
#> 218 Plantae Equisetopsida C.Navarro & L.Sáez
#> 228 Eucalyptus coolabah Blakely & Jacobs
#> published_in rank hits_unique
#> 1 https://id.biodiversity.org.au/reference/apni/49840 Species E2-W2 61
#> 19 https://id.biodiversity.org.au/reference/apni/49840 Species E2-W2 88
#> 115 https://id.biodiversity.org.au/reference/apni/49840 Species N2-S2 33
#> 140 https://id.biodiversity.org.au/reference/apni/49840 Species N2-S2 73
#> 218 Erodium Aedo N4-S4 90
#> 228 https://id.biodiversity.org.au/reference/apni/51428473 Species S1-N1 3
Note that ‘veg_barcode’ links species hits to the vegetation vouchers
module, while the ‘hits_unique’ field identifies the individual
point-intercept by transect and point number (see
help(ausplotsR)
and references for more details on the plot
layout and survey method). At each point, plant species (if any), growth
form and height are recorded along with substrate type.
Let’s visualise basic vegetation cover as a function of latitude.
First, we call the fractional_cover
function on the
extracted point-intercept data ($veg.PI
). The function
converts the raw data to proportional cover of green/brown vegetation
and bare substrate. Note the calculation may take a few minutes for many
AusPlots, so for this example we will pull out a subset of 100 randomly
drawn sites to work with.
<- my.ausplots.data$veg.PI[which(my.ausplots.data$veg.PI$site_unique %in% sample(my.ausplots.data$site.info$site_unique, 100)), ]
sites100 <- fractional_cover(sites100)
my.fractional
head(my.fractional)
#> site_unique NA. bare brown green
#> NTABRT0005-58863 NTABRT0005-58863 0.0 57.82 15.15 27.03
#> NTADAC0001-53518 NTADAC0001-53518 0.0 0.40 41.29 58.32
#> NTADAC0002-58039 NTADAC0002-58039 0.2 9.21 24.55 66.04
#> NTADMR0001-58868 NTADMR0001-58868 0.1 45.25 30.69 23.96
#> NTAFIN0001-53519 NTAFIN0001-53519 0.0 39.31 53.27 7.43
#> NTAFIN0003-53623 NTAFIN0003-53623 0.0 68.61 10.10 21.29
Next, we need to merge the fractional cover scores with longlat
coordinates from the site information table. We use the ‘site_unique’
field (unique combination of site and visit IDs) to link tables returned
from the get_ausplots
function:
<- merge(my.fractional, my.ausplots.data$site.info, by="site_unique")[,c("site_unique", "bare", "brown", "green", "NA.", "longitude", "latitude")]
my.fractional
<- na.omit(my.fractional)
my.fractional
head(my.fractional)
#> site_unique bare brown green NA. longitude latitude
#> 1 NTABRT0005-58863 57.82 15.15 27.03 0.0 133.6121 -22.29108
#> 2 NTADAC0001-53518 0.40 41.29 58.32 0.0 130.7779 -13.15835
#> 3 NTADAC0002-58039 9.21 24.55 66.04 0.2 132.3403 -12.73922
#> 4 NTADMR0001-58868 45.25 30.69 23.96 0.1 134.5674 -19.35310
#> 5 NTAFIN0001-53519 39.31 53.27 7.43 0.0 133.4679 -24.12430
#> 6 NTAFIN0003-53623 68.61 10.10 21.29 0.0 133.4770 -24.13220
Now we can plot out the continental relationship, e.g., between the proportion of bare ground with no kind of vegetation cover above and latitude.
plot(bare ~ latitude, data=my.fractional, pch=20, bty="l")
There appears to be a hump-backed relationship, with a higher proportion of bare ground in the arid inland at mid-latitudes. We can add a simple quadratic model to test/approximate this:
$quadratic <- my.fractional$latitude^2
my.fractional
<- lm(bare ~ latitude + quadratic, data=my.fractional)
LM summary(LM)
#>
#> Call:
#> lm(formula = bare ~ latitude + quadratic, data = my.fractional)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -35.230 -12.067 -3.814 10.811 66.688
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -148.13350 25.59925 -5.787 8.99e-08 ***
#> latitude -16.07236 2.14155 -7.505 3.12e-11 ***
#> quadratic -0.32951 0.04254 -7.745 9.79e-12 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 19.55 on 96 degrees of freedom
#> Multiple R-squared: 0.3908, Adjusted R-squared: 0.3781
#> F-statistic: 30.79 on 2 and 96 DF, p-value: 4.658e-11
#generate predicted values for plotting:
<- c(min(my.fractional$latitude), max(my.fractional$latitude))
MinMax <- data.frame(latitude=seq(from=MinMax[1], to=MinMax[2], length.out=50), quadratic=seq(from=MinMax[1], to=MinMax[2], length.out=50)^2)
ND $predict <- predict(LM, newdata=ND)
ND#
plot(bare ~ latitude, data=my.fractional, pch=20, bty="n")
points(ND$latitude, ND$predict , type="l", lwd=2, col="darkblue")
Aside from ‘gross’ values from plots such as fractional cover, many
analyses in community ecology begin with species abundance information.
With ausplotsR you can generate this easily from the
more complex vegetation point-intercept data. The first step to work
with species-level AusPlots data is to create a species occurrence
matrix. The species_table
function in the
ausplotsR package can be used to create this type of
matrix. This function takes a data frame of individual raw
point-intercept hits (i.e. a $veg.PI
data frame) generated
using the get_ausplots
function and returns a ‘species
against sites’ matrix:
#The species_table function below can also take the `$veg.voucher` module as input, but `m_kind="PA"` must be specified to get a sensible presence/absence output.
#The 'species_name' argument below specifies use of the "standardised_name" field to identify species, which is based on herbarium_determination names (i.e., "HD" option in species_name) matched to accepted scientific name according to a standard (APC: https://www.anbg.gov.au/cpbr/program/hc/hc-APC.html).
<- species_table(my.ausplots.data$veg.PI, m_kind="percent_cover", cover_type="PFC", species_name="SN")
my.sppBYsites
#check the number of rows (plots) and columns (species) in the matrix
dim(my.sppBYsites)
#> [1] 469 2181
#look at the top left corner (as the matrix is large)
1:5, 1:5]
my.sppBYsites[#> Abutilon Abutilon.fraseri Abutilon.halophilum Abutilon.hannii
#> NTAARP0001-58422 0 0 0 0
#> NTAARP0002-58423 0 0 0 0
#> NTAARP0003-58424 0 0 0 0
#> NTAARP0004-58918 0 0 0 0
#> NTAARP0005-58919 0 0 0 0
#> Abutilon.hannii.subsp..prostrate..p.k.latz.427.
#> NTAARP0001-58422 0
#> NTAARP0002-58423 0
#> NTAARP0003-58424 0
#> NTAARP0004-58918 0
#> NTAARP0005-58919 0
We can crudely pull out the 10 highest ranking species in terms of their percent cover cumulative across all plots they occur in:
rev(sort(colSums(my.sppBYsites)))[1:10]
#> Na Triodia.basedowii Triodia.pungens
#> 666.1903 634.2583 412.4752
#> Poaceae Eucalyptus.tetrodonta Triodia.bitextura
#> 394.5625 392.4752 389.0123
#> Eucalyptus.diversifolia Eucalyptus.baxteri Eucalyptus.obliqua
#> 386.0396 381.6362 370.1086
#> Cenchrus.ciliaris
#> 346.5918
A simple example of downstream visualisation and analysis of species-level AusPlots data is Rank-Abundance Curves (also known as Whittaker Plots). Rank-Abundance Curves provide further information on species diversity. They provide a more complete picture than a single diversity index. Their x-axis represents the abundance rank (from most to least abundant) and in the y-axis the species relative abundance. Thus, they depict both Species Richness and Species Evenness (slope of the line that fits the rank; steep gradient indicates low evenness and a shallow gradient high evenness).
#Whittaker plots for some selected AusPlots with alternative relative abundance models fitted to the plant community data:
par(mfrow=c(2,2), mar=c(4,4,1,1))
for(i in c(1:4)) {
plot(vegan::radfit(round(my.sppBYsites[9+i,], digits=0), log="xy"), pch=20, legend=FALSE, bty="l")
legend("topright", legend=c("Null", "Preemption", "Lognormal", "Zipf", "Mandelbrot"), lwd=rep(1, 5), col=c("black", "red", "green", "blue", "cyan"), cex=0.7, bty="n")
}
Perhaps you simply want to browse which plant species have been
recorded in AusPlots, without all the associated raw data? Here, the
species_list
function is your friend:
#The species_list function is designed to take $veg.voucher as input but can also take $veg.PI
#print a list of genus_species-only records from selected plots:
species_list(subset(my.ausplots.data$veg.vouch, site_unique %in% unique(site_unique)[1:2]), grouping="by_site", species_name="GS")
#> $NTAGFU0011
#> [1] Abutilon leucopetalum Acacia adoxa
#> [3] Acacia ancistrocarpa Acacia phlebocarpa
#> [5] Acacia wickhamii Afrohybanthus aurantiacus
#> [7] Alectryon oleifolius Aristida holathera
#> [9] Aristida perniciosa Aristida pruinosa
#> [11] Atalaya hemiglauca Bauhinia cunninghamii
#> [13] Blumea saxatilis Boerhavia coccinea
#> [15] Bonamia media Capparis lasiantha
#> [17] Chrysopogon fallax Corchorus sidoides
#> [19] Crotalaria medicaginea Cymbopogon bombycinus
#> [21] Dichanthium annulatum Dichanthium fecundum
#> [23] Digitaria brownii Dodonaea physocarpa
#> [25] Dolichandrone heterophylla Enneapogon avenaceus
#> [27] Enneapogon robustissimus Eriachne ciliata
#> [29] Eriachne melicacea Eriachne obtusa
#> [31] Eucalyptus leucophloia Eucalyptus pruinosa
#> [33] Evolvulus alsinoides Flueggea virosa
#> [35] Glycine canescens Grevillea parallela
#> [37] Grevillea striata Grewia retusifolia
#> [39] Hakea arborescens Heliotropium parviantrum
#> [41] Heliotropium ventricosum Heteropogon contortus
#> [43] Hibiscus sturtii Indigofera linifolia
#> [45] Indigofera linnaei Indigofera trita
#> [47] Jacquemontia browniana Marsdenia viridiflora
#> [49] Melhania oblongifolia Murdannia graminea
#> [51] NA NA Oldenlandia mitrasacmoides
#> [53] Phyllanthus exilis Polycarpaea breviflora
#> [55] Polygala longifolia Polygala pterocarpa
#> [57] Pterocaulon niveum Pterocaulon serrulatum
#> [59] Pterocaulon sphacelatum Ptilotus fusiformis
#> [61] Rhynchosia minima Scaevola ovalifolia
#> [63] Schizachyrium fragile Sehima nervosum
#> [65] Spermacoce brachystema Stylosanthes hamata
#> [67] Tephrosia leptoclada Terminalia canescens
#> [69] Themeda triandra Tinospora smilacina
#> [71] Triodia bitextura Tripogonella loliiformis
#> [73] Vigna lanceolata Waltheria indica
#> [75] Zornia muriculata
#>
#> $QDAMII0002
#> [1] Abutilon leucopetalum
#> [2] Acacia cowleana
#> [3] Acacia lysiphloia
#> [4] Acacia sericophylla
#> [5] Alternanthera sp. Mt Isa (R.L.Specht+ 49) Qld Herbarium
#> [6] Aristida latifolia
#> [7] Atalaya hemiglauca
#> [8] Boerhavia coccinea
#> [9] Bonamia media
#> [10] Bothriochloa ewartiana
#> [11] Bulbostylis barbata
#> [12] Chrysopogon fallax
#> [13] Convolvulus clementii
#> [14] Corymbia aparrerinja
#> [15] Corymbia terminalis
#> [16] Crotalaria medicaginea
#> [17] Cucumis melo
#> [18] Dichanthium sericeum
#> [19] Enneapogon polyphyllus
#> [20] Enneapogon purpurascens
#> [21] Enneapogon robustissimus
#> [22] Eucalyptus leucophloia
#> [23] Eucalyptus pruinosa
#> [24] Eulalia aurea
#> [25] Euphorbia tannensis
#> [26] Gossypium australe
#> [27] Indigofera colutea
#> [28] Indigofera linifolia
#> [29] Ipomoea coptica
#> [30] Ipomoea polymorpha
#> [31] Iseilema macratherum
#> [32] Mnesithea formosa
#> [33] NA NA
#> [34] Paspalidium rarum
#> [35] Portulaca oleracea
#> [36] Rhynchosia minima
#> [37] Salsola australis
#> [38] Senna notabilis
#> [39] Sida cleisocalyx
#> [40] Solanum quadriloculatum
#> [41] Sporobolus australasicus
#> [42] Tephrosia NA
#> [43] Themeda triandra
#> [44] Triodia pungens
#> [45] Urochloa subquadripara
#> [46] Ventilago viminalis
#> [47] Vigna sp. McDonald Downs Station (R.A.Perry 3416) Qld Herbarium
#overall species list ordered by family (for demonstration we print only part):
species_list(my.ausplots.data$veg.vouch, grouping="collapse", species_name="SN", append_family=TRUE)[1:20]
#> [1] Acanthaceae--Brunoniella australis
#> [2] Acanthaceae--Brunoniella linearifolia
#> [3] Acanthaceae--Dicliptera armata
#> [4] Acanthaceae--Dipteracanthus australasicus
#> [5] Acanthaceae--Hygrophila angustifolia
#> [6] Acanthaceae--Nelsonia campestris
#> [7] Acanthaceae--Pseuderanthemum variabile
#> [8] Acanthaceae--Rostellularia adscendens
#> [9] Acanthaceae--Rostellularia adscendens var. pogonanthera
#> [10] Aizoaceae--Carpobrotus
#> [11] Aizoaceae--Carpobrotus rossii
#> [12] Aizoaceae--Carpobrotus virescens
#> [13] Aizoaceae--Disphyma crassifolium subsp. clavellatum
#> [14] Aizoaceae--Gunniopsis
#> [15] Aizoaceae--Gunniopsis calcarea
#> [16] Aizoaceae--Gunniopsis kochii
#> [17] Aizoaceae--Gunniopsis quadrifida
#> [18] Aizoaceae--Gunniopsis septifraga
#> [19] Aizoaceae--Gunniopsis zygophylloides
#> [20] Aizoaceae--Mesembryanthemum crystallinum
In addition to the key site info and vegetation point-intercept
modules introduced above, get_ausplots
is your gateway to
raw data modules for vegetation structural summaries, vegetation
vouchers (covers the full species diversity observed at the plot and
includes tissue sample details), basal wedge, and soils subsites, bulk
density and pit/characterisation (including bulk and metagenomics soil
samples).
Blanco-Martin, B. (2019) Tutorial: Understanding and using the ‘ausplotsR’ package and AusPlots data. Terrestrial Ecology Research Network. Version 2019.04.0, April 2019. https://github.com/ternaustralia/TERN-Data-Skills/
Sparrow, B., Foulkes, J., Wardle, G., Leitch, E., Caddy-Retalic, S., van Leeuwen, S., Tokmakoff, A., Thurgate, N., Guerin, G.R. and Lowe, A.J. (2020) A vegetation and soil survey method for surveillance monitoring of rangeland environments. Frontiers in Ecology and Evolution, 8:157.