Our goal is to predict plant tissue \(\delta\)13C variation across a landscape. The primary driver of variation in plant \(\delta\)13C is the greater isotopic fractionation in C3 plants compared to C4 plants. The crossover temperature model is a physiologically based model that explains the turnover from C3 to C4 plants along gradients of temperature (Ehleringer et al., 1997; Collatz et al., 1998; Still et al., 2003). Note that \(\delta\)13C also varies with photosynthetic subtype in C4 plants and with rainfall in woody C3 plants (Cerling & Harris, 1999; Diefendorf et al., 2010; Kohn, 2010). Below, the shaded regions shows the effect of CO2 and temperature on the light use efficiency of C3 plants, and illustrates the temperature at which C3 efficiency drops below that of the average C4 plant.
We will combine the crossover temperature model with data on land cover and climate to produce map of C3 and C4 plants in Colorado. Then, we will apply isotopic end member values to produce a spatially continuous representation of the distribution \(\delta\)13C across Colorado. These layers are useful for understanding grass biogeography and for studies seeking to identify the movement of animals (e.g., Hobson, 1999; Powell et al., 2012)
The code for this workflow is a work in progress, and we are working to produce an R package that will allow all of the pieces to be applied in custom pipelines. This package is called “grassmap” and is installed below.
This workflow also requires learning some basic fuctionality in the raster R package.
installation requires GitHub
install.packages("devtools", repos = "http://cran.us.r-project.org")
library(devtools)
install_github(repo = "rebeccalpowell/grassmapr")
library(grassmapr)
Now we need to load and organize the spatial datasets that we will use.
# These are to be replaced by new data stored by Becky
#data("COMeanppt")
#data("COMeantmp")
#data("COC3Crop")
#data("COC4Crop")
#data("COHerb")
#data("COWoody")
# TEMPORARY CODE BEFORE BECKY ADDS TO PACKAGE
tmp <- stack("NA-example-data/North-America-Temperature.tif")
pre <- stack("NA-example-data/North-America-Rainfall.tif")
woody <- raster("NA-example-data/North-America-Woody-Cover.tif")
ndvi <- stack("NA-example-data/North-America-NDVI.tif")
c4_crop <- raster("NA-example-data/North-America-C4-Crops.tif")
The rainfall and temperature data are monthly climatologies, and so we might want to visualize them hear as annual means.
annual.tmp <- stackApply(x = tmp, indices = rep(1,12), fun = mean)
annual.pre <- stackApply(x = pre, indices = rep(1,12), fun = sum)
And, now we should plot the data. Based on the crossover temperature model, where would you expect to find C4 grasses?
par(mfrow = c(2,3))
plot(annual.tmp, main = expression(paste("Mean Annual Temperature (", ~degree, "C)", sep = "")))
plot(annual.pre, main = expression(paste("Total Annual Rainfall (mm)", sep = "")))
plot(woody, main = expression(paste("Woody % Cover", sep = "")))
plot(c4_crop, main = expression("C"[4]~"Crops (%)"))
We should ensure that all data have the same spatial extent and resolution.
compareRaster(tmp,
pre,
woody,
ndvi,
c4_crop)
If these layers did not have the same extent and resolution, we could use the function resample() in order to make these layers compatible with eachother.
Now, we might want to include a layer for weighting the contribution of plant activity in each month to the total annual composition of C3 and C4 plants, and their isotopic composition.
plot(ndvi[[6]], main = "June NDVI")
First, set a temperature threshold based on the crossover temperature model. In addtion, set a minimum monthly rainfall threshold, above which grasses will grow - this masks out mediterranean climates.
# Set a temperature threshold for the COT model
temp.threshold <- 22
# Set a rainfall threshold
precip.threshold <- 25
# Set a growing season temperature
gs.threshold <- 5
# Growing season precipitation mask (>= 25 mm)
precip_mask <- maskClimateVals(pre, precip.threshold)
# Growing season temperature mask (>= 5 deg. C)
GS_temp_mask <- maskClimateVals(tmp, gs.threshold)
# C4 temperature mask (>= 22 deg. C)
C4_temp_mask <- maskClimateVals(tmp, temp.threshold)
# Generate Growing Season (GS) climate masks
GS_mask <- combineMasks(GS_temp_mask, precip_mask)
# Generate C4 climate masks
C4_mask <- combineMasks(C4_temp_mask, precip_mask)
# Count number of months that satisfy each climate criteria
GS_month_total <- countMonths(GS_mask)
C4_month_total <- countMonths(C4_mask)
par(mfrow = c(1,2))
plot(GS_month_total, zlim = c(0, 12), axes = F, legend = F)
plot(C4_month_total, zlim = c(0, 12), axes = F, legend = F)
# Calculate C4 ratio based on C4 climate only
C4_ratio <- calcC4Ratio(C4_mask, GS_mask)
# OR Calculate C4 ratio based on C4 climate AND vegetation productivity
C4_ratio_vi <- calcC4Ratio(C4_mask, GS_mask, veg.index = ndvi)
plot(C4_ratio_vi, axes = F, legend = F)
# Create raster stack of other (non-grassy) vegetation layers
veg_layers <- stack(c4_crop, woody)
#Indicate layers that correspond to C4 vegetation
C4_flag <- c(1, 0)
# Indicate layers that correspond to herbaceous vegetation
herb_flag <- c(1, 0)
# TEMPORARY # BECKY - can you push your version of this fix to the GitHub rep?
source("../R-scripts_data_prep/calcPFTCover-dmg-edits.R")
pft_cover <- calcPFTCover.dmg(C4.ratio = C4_ratio_vi,
GS.mask = GS_mask,
veg.layers = veg_layers,
C4.flag = C4_flag,
herb.flag = herb_flag)
plot(pft_cover) # now works excpect still need to get rid of rare high c4 herb values
plot(sum(pft_cover)) # now works excpect still need to get rid of rare high c4 herb values
We now want to combine data from all present vegetation types. First, choose endmembers for these vegetation types. This has been done in the function call below. We will use a second wrapper function, called isoscape() that will do all of the heavy lifting for us. Similar to the last step, we will also supply climate data and thresholds in addition to land cover layers.
This function is simply applying the crossover temperature model, as before, and then weighting the contributions of endmembers ( C4 grass, C3 grass, C3 woody, and both crop functional types) by their cover abundance. The internal functions for doing this are easily applied to custom cover types, but we are continually working to make the whole process more flexible.
# d13C endmember vector for PFT layers from the literature
d13C_emb <- c(-12.5, -26.7, -27.0) # C4 herb, C3 herb, Woody
# Apply mixing model to generate d13C isoscape
d13C_iso <- calcDel13C(pft_cover, d13C_emb)
# Standard deviations of d13C endmember means from the literature
d13C_std <- c(1.1, 2.3, 1.7) # C4 herb, C3 herb, Woody
# Calculate weighted standard deviation of mean d13C values
d13C_iso_std <- calcDel13C(pft_cover, d13C_std)
par(mfrow = c(2,3))
plot(pft_cover$C4_herb, main = "Herbaceous C4 %",
xlab = "", ylab = "", zlim = c(0,100))
plot(pft_cover$C3_herb, main = "Herbaceous C3 %",
xlab = "", ylab = "", zlim = c(0,100))
plot(pft_cover$layer.2, main = "Woody %",
xlab = "", ylab = "", zlim = c(0,100))
plot(d13C_iso, main = expression(Plant~{delta}^13*C~'\211'),
xlab = "", ylab = "")
plot(d13C_iso_std, main = expression(StDev~{delta}^13*C~'\211'),
xlab = "", ylab = "")
Thank you for your time, and I hope you enjoyed this test version of grassmapr!
Cerling, T. E., & Harris, J. M. (1999). Carbon isotope fractionation between diet and bioapatite in ungulate mammals and implications for ecological and paleoecological studies. Oecologia, 120, 347 - 363.
Collatz, G. J., Berry, J. A., & Clark, J. S. (1998). Effects of climate and atmospheric CO2 partial pressure on the global distribution of C4 grasses: Present, past, and future. Oecologia, 114, 441 - 454.
Diefendorf, A. F., Mueller, K. E., Wing, S. L., Koch, P. L., & Freeman, K. H. (2010). Global patterns in leaf 13C discrimination and implications for studies of past and future climate. Proceedings of the National Academy of Sciences USA, 107, 5738 - 5743.
Ehleringer, J. R., Cerling, T. E., & Helliker, B. R. (1997). C 4 photosynthesis, atmospheric CO 2 , and climate. Oecologia, 112, 285 - 299.
Hobson, K. A. (1999). Tracing origins and migration of wildlife using stable isotopes: A review. Oecologia, 120, 314 - 326.
Kohn, M. J. (2010). Carbon isotope compositions of terrestrial C3 plants as indicators of (paleo) ecology and (paleo) climate. Proceedings of the National Academy of Sciences USA, 107, 19691 - 19695.
Powell, R. L., Yoo, E.-H., & Still, C. J. (2012). Vegetation and soil carbon 13 isoscapes for South America: Integrating remote sensing and ecosystem isotope measurements. Ecosphere, 3, 1 - 25.
Still, C. J., Berry, J. A., Collatz, G. J., & DeFries, R. S. (2003). Global distribution of C 3 and C 4 vegetation: Carbon cycle implications. Global Biogeochemical Cycles, 17, 1006.