knitr::opts_chunk$set( collapse = TRUE, require(fortedata), require(ggplot2), require(viridis), require(magrittr), require(dplyr) )
Multiple remote sensing technologies are being employed in FoRTE to collect data with the goal of creating a record of forest canopy structural and spectral change. These data are collected coincident with other data as outlined below (see Remote Sensing Methods). Canopy structure affects ecosystem functioning through altering light transmission/interception, subsequently affecting ecosystem functioning (e.g. productivity and the acquisition/use-efficiency of resources). See [the FoRTE Proposal Narrative] (https://fortexperiment.github.io/fortedata/articles/fd_forte_proposal_vignette.html) for further details.
Below we outline the remote sensing oriented data and functions included in fortedata
.
The fd_remote_sensing()
script within fortedata
currently includes the following functions:
fd_hemi_camera()
returns a single data set that includes derived estimates of leaf area index, gap fraction, clumping index, and NDVI (normalized difference vegetation index) from terrestrial, upward-facing hemispherical photos looking into the forest canopy taken 1 meter above-ground (Table S9 in ESSD manuscript, Atkins et al. 2020).
fd_canopy_structure()
returns a single data set that includes 28 structural metrics estimating canopy structural traits such as height, area/density, openness, complexity, and arrangement. Data were processed using forestr
version 1.0.1 (Atkins et al. 2018) in R Version 3.6.2.
fd_ceptometer()
returns a single data set that includes estimates of the fraction of photosynthetically available radiation (faPAR) absorbed by the canopy as well as leaf area index (LAI_cept)--each derived from a handheld ceptometer (LP-80; Decagon Devices) (Table S11 in Atkins et al. 2020).
fortedata
is an evolving, open-science data package with data updated in near-real time. The current number of remote sensing data observations available as of r Sys.Date()
are detailed in Figure 1.
no_of_records.df <- fd_observations() no_of_records <- subset(no_of_records.df, table == 'fd_canopy_structure' | table == 'fd_hemi_camera') ggplot2::ggplot(no_of_records, ggplot2::aes(x = as.factor(month), y = as.integer(year), fill= no_of_obs)) + ggplot2::geom_tile(ggplot2::aes(fill = no_of_obs), color = "black") + ggplot2::geom_text(ggplot2::aes(label = no_of_obs), color = "white") + ggplot2::coord_equal()+ ggplot2::scale_fill_gradient(low = "#450d54", high = "#450d54", na.value = 'white')+ ggplot2::scale_y_reverse()+ ggplot2::theme_minimal()+ ggplot2::theme(legend.position = "none")+ ggplot2::ylab("Year")+ ggplot2::xlab("Month")+ ggplot2::ggtitle(paste("Figure 1: No. of observations currently available \nin each remote sensing function as of:", Sys.Date()))+ ggplot2::facet_grid(table ~ ., space = "free")+ ggplot2::theme(strip.text.y = element_text(size = 9), strip.background = element_rect( color="black", fill="white", size= 0.5, linetype="solid"))
fd_canopy_structure()
contains canopy structural trait metrics (Fahey et al. 2019) derived from 2-D terrestrial lidar data. These data were collected with a user-mounted, portable canopy LiDAR (PCL) system equipped with an upward facing, pulsed‐laser operating at 2000 Hz (Riegl LD90 3100 VHS; Riegl USA Inc., Orlando, Florida, USA). The PCL generates continuous LiDAR returns from a “slice” of the canopy as it is walked along a measured transect. For this study, we used 40 m transects at cardinal directions--north-to-south, east-to-west--through subplot center for a total of 80 m of transect length per subplot. This mirrors the approach of Atkins et al. (2018) and Hardiman et al. (2013) and is sufficient to account for spatial variability of forest structure (Hardiman et al. 2019). A more detailed description of the development and implementation of this terrestrial laser scanning system is available in Parker et al. (2004) and Hardiman et al. ( 2011). We derived canopy structural metrics using the forestr
package (Atkins et al. 2018a, b) in R 3.5 (R Core Team, 2018). Data here are provided at the transect level, but should be averaged to make a plot mean.
data.frame(fd_canopy_structure_summary())
x <- fd_canopy_structure() # bring in metadata via the plot_metadata() function df <- fortedata::fd_plot_metadata() # now we convert the tibble to a data frame df <- data.frame(df) # First we want to concatenate our replicate, plot and subplot data to make a subplot_id column df$subplot_id <- paste(df$replicate, 0, df$plot, df$subplot, sep = "") df$subplot_id <- as.factor(df$subplot_id) # Now that we have our data in the form for this analysis, let's filter our metadata to the subplot level. df %>% select(subplot_id, disturbance_severity, treatment) %>% distinct() %>% data.frame() -> dis.meta.data # this filters the metadata down to the subplot_id level dis.meta.data <- dis.meta.data[c(1:32), ] # Then we merge with the metadata from above x <- merge(x, dis.meta.data) # For this analysis we want to code both disturbance severity and treatment as factors x$disturbance_severity <- as.factor(x$disturbance_severity) x$treatment <- as.factor(x$treatment) # forte color palette forte_pal <- forte_colors() # first let's make some new, more informative labels for our facets facet.labs <- c("B" = "Bottom-Up", "T" = "Top-Down") ggplot2::ggplot(x, aes(y = rugosity, x = disturbance_severity, fill = disturbance_severity))+ geom_boxplot(color = "black")+ geom_jitter(position = position_jitter(0.2), shape = 21, alpha = 0.3)+ xlab("Disturbance Severity")+ ylab("Canopy Rugosity [m]")+ theme_minimal()+ scale_color_manual(values = forte_pal, guide = FALSE)+ scale_fill_manual(values = forte_pal, name = "Disturbance Severity", labels = c("0%", "45%", "65%", "85%"))+ theme(legend.position = "bottom")+ ggplot2::ggtitle(paste("Figure 2: Canopy rugosity, a measure of canopy structural \n complexity by replicate, by year"))+ facet_grid(year ~ treatment, labeller = labeller(treatment = facet.labs))
Below-canopy, hemispherical images were taken using a 24 Megapixel DSLR camera (Regent Instruments; Quebec, QU, Canda) with a 180° hemispherical lens during peak leaf-out (~July). The camera was facing-upwards, into the canopy and was mounted on a self-leveling tripod with the lens at 1 m from the ground. Leaf area index (LAI~CAM~) was estimated using WinSCANOPY (Regent Instruments). Images were taken at all nested subplots (see fd_experimental_design_vignette
).
{width=40%}
{width=50%}
fd_hemi_camera()
x <- fd_hemi_camera() # bring in metadata via the plot_metadata() function df <- fortedata::fd_plot_metadata() # now we convert the tibble to a data frame df <- data.frame(df) # First we want to concatenate our replicate, plot and subplot data to make a subplot_id column df$subplot_id <- paste(df$replicate, 0, df$plot, df$subplot, sep = "") df$subplot_id <- as.factor(df$subplot_id) # Now that we have our data in the form for this analysis, let's filter our metadata to the subplot level. df %>% select(subplot_id, disturbance_severity, treatment) %>% distinct() %>% data.frame() -> dis.meta.data # this filters the metadata down to the subplot_id level dis.meta.data <- dis.meta.data[c(1:32), ] # Then we merge with the metadata from above x <- merge(x, dis.meta.data) # For this analysis we want to code both disturbance severity and treatment as factors x$disturbance_severity <- as.factor(x$disturbance_severity) x$treatment <- as.factor(x$treatment) # forte color palette forte_pal <- forte_colors() # first let's make some new, more informative labels for our facets facet.labs <- c("B" = "Bottom-Up", "T" = "Top-Down") # let's look at distribution by year, by disturbance severity and treatment ggplot(x, aes(y = lai_cam, x = disturbance_severity, fill = disturbance_severity))+ geom_boxplot(color = "black")+ geom_jitter(position = position_jitter(0.2), shape = 21, alpha = 0.3)+ xlab("Disturbance Severity")+ ylab("Leaf Area Index")+ theme_minimal()+ scale_color_manual(values = forte_pal, guide = FALSE)+ scale_fill_manual(values = forte_pal, name = "Disturbance Severity", labels = c("0%", "45%", "65%", "85%"))+ theme(legend.position = "bottom")+ ggplot2::ggtitle(paste("Figure 3: Camera LAI by replicate, by year"))+ facet_grid(. ~ treatment, labeller = labeller(treatment = facet.labs))
Light data--as fpar, the fraction of photosynthetically available radiation absorbed by the canopy--was acquired using a Decagon LP-80 handheld ceptometer (Decagon Devices; Pullman, Washington). fpar is the ratio of PAR above the canopy, to that measured below. fpar is assumed to be the difference between the two values. Below-canopy PAR measurements for each plot were taken along north-south and east-west transects (similar to PCL data above), with measurements taken every 1 to 3 m for a total of 30 - 60 measurements then averaged to make a subplot level mean of below-canopy PAR. Above-canopy PAR measurements were taken in open areas to ensure no interference from the canopy.
fd_ceptometer()
x <- fd_ceptometer() # bring in metadata via the plot_metadata() function df <- fortedata::fd_plot_metadata() # now we converte the tibble to a data frame df <- data.frame(df) # First we want to concatenate our replicate, plot and subplot data to make a subplot_id column df$subplot_id <- paste(df$replicate, 0, df$plot, df$subplot, sep = "") df$subplot_id <- as.factor(df$subplot_id) # Now that we have our data in the form for this analysis, let's filter our metadata to the subplot level. df %>% select(subplot_id, disturbance_severity, treatment) %>% distinct() %>% data.frame() -> dis.meta.data # this filters the metadata down to the subplot_id level dis.meta.data <- dis.meta.data[c(1:32), ] # Then we merge with the metadata from above x <- merge(x, dis.meta.data) # For this analysis we want to code both disturbance severity and treatment as factors x$disturbance_severity <- as.factor(x$disturbance_severity) x$treatment <- as.factor(x$treatment) # forte color palette forte_pal <- forte_colors() # first let's make some new, more informative labels for our facets facet.labs <- c("B" = "Bottom-Up", "T" = "Top-Down") # let's look at distribution by year, by disturbance severity and treatment ggplot(x, aes(y = fapar, x = disturbance_severity, fill = disturbance_severity))+ geom_boxplot(color = "black")+ geom_jitter(position = position_jitter(0.2), shape = 21, alpha = 0.3)+ xlab("Disturbance Severity")+ ylab("faPAR")+ theme_minimal()+ scale_color_manual(values = forte_pal, guide = FALSE)+ scale_fill_manual(values = forte_pal, name = "Disturbance Severity", labels = c("0%", "45%", "65%", "85%"))+ theme(legend.position = "bottom")+ ggplot2::ggtitle(paste("Figure 4: faPAR by replicate, by year"))+ facet_grid(. ~ treatment, labeller = labeller(treatment = facet.labs))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.