#' Plot functional space and chosen functional indices
#'
#' Compute a graphical representation of functional indices. \strong{To plot
#' functional indices, functional indices values must have been retrieve
#' through the use of the} \code{\link{alpha.fd.multidim}} \strong{function}.
#'
#' @param output_alpha_fd_multidim a list of objects retrieved through the
#' \code{\link{alpha.fd.multidim}} function.
#'
#' @param plot_asb_nm a vector containing name(s) of assemblage(s) to plot.
#'
#' @param ind_nm a vector of character string of the name of functional
#' indices to plot. \strong{Indices names must be written in lower case
#' letters}. Possible indices to compute are: "fdis", "feve", "fric", "fdiv",
#' "fori" and "fspe". Default: all the indices are computed.
#'
#' @param faxes a vector with names of axes to plot. \strong{You can only plot
#' from 2 to 4 axes for graphical reasons: vector length should be between 2
#' and 4}. Default: faxes = NULL (the four first axes will be plotted).
#'
#' @param faxes_nm a vector with axes labels if the user want different axes
#' labels than \code{faxes} ones. Default: faxes_nm = faxes (labels will the
#' the same that \code{faxes} ones).
#'
#' @param range_faxes a vector with minimum and maximum for values for axes.
#' Note that to have a fair representation of position of species in all
#' plots, all axes must have the same range. Default: faxes_lim = c(NA, NA)
#' (the range is computed according to the range of values among all axes, all
#' axes having the same range).
#'
#' @param color_bg a R color name or an hexadecimal code used to fill plot
#' background. Default: `color_bg = "grey95"`.
#'
#' @param size_sp a vector gathering numeric values referring to the size of
#' species belonging to the global pool and the plotted assemblage(s).
#' It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param size_sp_nm a numeric value referring to the size of species names
#' if plotted.
#'
#' @param color_sp a vector gathering R color names or hexadecimal codes
#' referring to the color of species from the global pool and studied
#' assemblage(s). It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param color_vert a vector gathering R color names or hexadecimal codes
#' referring to the color of vertices from the global pool and studied
#' assemblage(s). It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param color_centroid_fspe a vector gathering R color name or
#' hexadecimal code used to draw FSpe centroid (i.e. center of the
#' functional space) color.
#'
#' @param color_ch a vector gathering R color names or hexadecimal codes
#' referring to the color of the convex pool of the global pool and studied
#' assemblage(s). It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param color_sp_nm a R color name or hexadecimal code referring to the
#' color of names of species if plotted.
#'
#' @param fill_sp a vector gathering R color names or hexadecimal codes
#' referring to the filled color of species from the global pool and studied
#' assemblage(s). It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param fill_vert a vector gathering R color names or hexadecimal codes
#' referring to the filled color of vertices from the global pool and studied
#' assemblage(s). It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param fill_ch a vector gathering R color names or hexadecimal codes
#' referring to the color to fill the convex pool of the global pool and
#' studied assemblage(s).
#' It should be written as c(pool = "...", asb1 = "...", ...).
#'
#' @param alpha_ch a vector gathering numeric values referring to the opacity
#' of convex hulls of the global pool and the plotted assemblage(s).
#' It should be written as c(pool = "...", asb1 = "...", ...).
#' (0 = high transparency, 1 = no transparency).
#'
#' @param shape_sp a vector gathering numeric values referring to the symbol
#' used to draw species from the global pool and the plotted assemblage(s).
#' It should be written as c(pool = "...", asb1 = "...", ...).
#' (0 = high transparency, 1 = no transparency).
#'
#' @param shape_centroid_fdis a vector gathering numeric value(s) used to draw
#' FDis centroid size.
#'
#' @param shape_centroid_fdiv a vector gathering numeric value(s) used to draw
#' FDiv centroid size.
#'
#' @param shape_centroid_fspe a vector gathering numeric value used to draw
#' FSpe centroid (i.e. center of the functional space) size.
#'
#' @param plot_sp_nm a vector containing species names that are to be plotted.
#' Default: `plot_nm_sp = NULL` (no name plotted).
#'
#' @param fontface_sp_nm a character string for font of species labels (e.g.
#' "italic", "bold"). Default: `fontface_sp_nm = 'plain'`.
#'
#' @param save_file a logical value telling if plots should be locally
#' saved or not.
#'
#' @param check_input a logical value indicating whether key features the
#' inputs are checked (e.g. class and/or mode of objects, names of rows
#' and/or columns, missing values). If an error is detected, a detailed
#' message is returned. Default: `check.input = TRUE`.
#'
#' @return If \code{name_file} is \code{NULL}, it returns a list of one
#' \code{ggplot2} plots per functional index containing plots for combinations
#' of up to four axes, a \code{patchwork} figure gathering all combinations of
#' axes and a \code{ggplot2} figure showing the plot caption. If
#' \code{name_file} is not \code{NULL}, then those plots are saved locally.
#'
#' @export
#'
#' @author Camille Magneville and Sebastien Villeger
#'
#' @examples
#' \donttest{
#'
#' # Load Species*Traits dataframe:
#' data("fruits_traits", package = "mFD")
#'
#' # Load Assemblages*Species dataframe:
#' data("baskets_fruits_weights", package = "mFD")
#'
#' # Load Traits categories dataframe:
#' data("fruits_traits_cat", package = "mFD")
#'
#' # Compute functional distance
#' sp_dist_fruits <- mFD::funct.dist(sp_tr = fruits_traits,
#' tr_cat = fruits_traits_cat,
#' metric = "gower",
#' scale_euclid = "scale_center",
#' ordinal_var = "classic",
#' weight_type = "equal",
#' stop_if_NA = TRUE)
#'
#' # Compute functional spaces quality to retrieve species coordinates matrix:
#' fspaces_quality_fruits <- mFD::quality.fspaces(sp_dist = sp_dist_fruits,
#' maxdim_pcoa = 10,
#' deviation_weighting = "absolute",
#' fdist_scaling = FALSE,
#' fdendro = "average")
#'
#' # Retrieve species coordinates matrix:
#' sp_faxes_coord_fruits <- fspaces_quality_fruits$details_fspaces$sp_pc_coord
#'
#' # Compute alpha diversity indices:
#' alpha_fd_indices_fruits <- mFD::alpha.fd.multidim(
#' sp_faxes_coord = sp_faxes_coord_fruits[, c("PC1", "PC2", "PC3", "PC4")],
#' asb_sp_w = baskets_fruits_weights,
#' ind_vect = c("fdis", "fmpd", "fnnd", "feve", "fric", "fdiv",
#' "fori", "fspe"),
#' scaling = TRUE,
#' check_input = TRUE,
#' details_returned = TRUE)
#'
#' # Plot all fd alpha indices:
#' plots_alpha <- mFD::alpha.multidim.plot(
#' output_alpha_fd_multidim = alpha_fd_indices_fruits,
#' plot_asb_nm = c("basket_1", "basket_5"),
#' ind_nm = c("fdis", "fide", "fnnd", "feve",
#' "fric", "fdiv", "fori",
#' "fspe"),
#' faxes = NULL,
#' faxes_nm = NULL,
#' range_faxes = c(NA, NA),
#' color_bg = "grey95",
#' shape_sp = c(pool = 3, asb1 = 21,
#' asb2 = 21),
#' size_sp = c(pool = 0.7, asb1 = 1,
#' asb2 = 1),
#' color_sp = c(pool = "grey50",
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' color_vert = c(pool = "grey50",
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' fill_sp = c(pool = NA,
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' fill_vert = c(pool = NA,
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' color_ch = c(pool = NA,
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' fill_ch = c(pool = "white",
#' asb1 = "#1F968BFF",
#' asb2 = "#DCE319FF"),
#' alpha_ch = c(pool = 1, asb1 = 0.3,
#' asb2 = 0.3),
#' shape_centroid_fdis = c(asb1 = 22, asb2 = 24),
#' shape_centroid_fdiv = c(asb1 = 22, asb2 = 24),
#' shape_centroid_fspe = 23,
#' color_centroid_fspe = "black",
#' size_sp_nm = 3,
#' color_sp_nm = "black",
#' plot_sp_nm = NULL,
#' fontface_sp_nm = "plain",
#' save_file = FALSE,
#' check_input = TRUE)
#'
#' # Check FRic plot:
#' plots_alpha$fric$patchwork
#' }
alpha.multidim.plot <- function(output_alpha_fd_multidim,
plot_asb_nm,
ind_nm = c("fide", "fric", "fdiv",
"fdis", "feve","fori",
"fspe", "fnnd"),
faxes = NULL,
faxes_nm = NULL,
range_faxes = c(NA, NA),
color_bg = "grey95",
shape_sp = c(pool = 3, asb1 = 21,
asb2 = 21),
size_sp = c(pool = 0.7, asb1 = 1,
asb2 = 1),
color_sp = c(pool = "grey50",
asb1 = "#0072B2",
asb2 = "#D55E00"),
color_vert = c(pool = "grey50",
asb1 = "#0072B2",
asb2 = "#D55E00"),
fill_sp = c(pool = NA,
asb1 = "#FFFFFF30",
asb2 = "#FFFFFF30"),
fill_vert = c(pool = NA,
asb1 = "#0072B2",
asb2 = "#D55E00"),
color_ch = c(pool = NA,
asb1 = "#0072B2",
asb2 = "#D55E00"),
fill_ch = c(pool = "white",
asb1 = "#0072B2",
asb2 = "#D55E00"),
alpha_ch = c(pool = 1, asb1 = 0.3,
asb2 = 0.3),
shape_centroid_fdis = c(asb1 = 22, asb2 = 22),
shape_centroid_fdiv = c(asb1 = 24, asb2 = 25),
shape_centroid_fspe = 23,
color_centroid_fspe = "black",
size_sp_nm = 3,
color_sp_nm = "black",
plot_sp_nm = NULL,
fontface_sp_nm = "plain",
save_file = FALSE,
check_input = TRUE) {
# compulsory check that indices values and details available in main input:
if (!identical(names(output_alpha_fd_multidim),
c("functional_diversity_indices","details"))) {
stop("Input 'output_alpha_fd_multidim' should be the output of the ",
"'alpha.fd.multidim' function run with 'details = TRUE'.")
}
# shorten names of main input: ####
asb_fd_ind <- output_alpha_fd_multidim$functional_diversity_indices
fd_details <- output_alpha_fd_multidim$details
# get coordinates of species:
sp_faxes_coord <- fd_details$sp_faxes_coord
# Check inputs relative to this function ...
# ... (funct.space.plot, already done) ####
if (check_input) {
# check that all functional diversity indices have the right names:
if (any(! ind_nm %in%
c("fide", "fdis", "fnnd", "feve", "fric", "fdiv", "fori", "fspe"))) {
stop("Names of functional diversity indices in 'ind_nm' are not well ",
"written. Please re-write them. Be careful, they should all be ",
"written in lowercase letters.")
}
# check that indices to plot are contained in the fd_ind_value table:
# remove fide (if plotted) from the indices names because it as...
# ...differents names in the dataframe: fide_PC1, fide_PC2, ...
if ("fide" %in% ind_nm) {
ind_nm2 <- ind_nm[! ind_nm %in% "fide"]
if (any(! ind_nm2 %in% colnames(asb_fd_ind)) == TRUE) {
stop("Functional diversity indices to plot must have been ",
"computed with alpha.fd.multidim() function and thus be in ",
"output_alpha_fd_multidim object.")
}
}
if (! "fide" %in% ind_nm) {
if (any(! ind_nm %in% colnames(asb_fd_ind)) == TRUE) {
stop("Functional diversity indices to plot must be contained in ",
"'fd_ind_values' columns.")
}
}
# check that good number of assemblage(s) to plot:
if (!length(plot_asb_nm) %in% c(1, 2)) {
stop("This function can only plot one or two assemblages. Please chose ",
"two or less assemblages to plot.")
}
# check that assemblage(s) to plot has(ve) the right name(s):
if ( any( ! plot_asb_nm %in% row.names(asb_fd_ind)) ) {
stop("Name(s) of assemblage(s) to plot is(are) provided in ",
"'plot_asb_nm' do not match those in ",
"'output_alpha_fd_multidim$asb_fd_ind. Please re-write.")
}
if (! is.null(faxes)) {
if (length(faxes) > 4) {
stop("Number of functional axes should be less than 4. Please change ",
"the number of functional axes to plot.")
}
if (any(! faxes %in% colnames(sp_faxes_coord))) {
stop("Names of axes to plot can not be found in 'sp_faxes_coord' ",
"columns names. Please check names of axes you want to plot.")
}
}
if ((! is.null(faxes_nm)) && (length(faxes_nm) != length(faxes))) {
stop("Length of 'faxes_nm' should be equal to length of 'faxes'. ",
"Please check congruence between these inputs.")
}
} # end of check input
# Prepare data for plotting ####
# create a list of store outputs:
list_panels <-list()
# get names of assemblages:
pool <- "pool"
asb1 <- plot_asb_nm[1]
nm_asb <- asb1
two_asb <- FALSE
if (length(plot_asb_nm) == 2) {
two_asb <- TRUE
asb2 <- plot_asb_nm[2]
nm_asb <- paste(nm_asb, asb2, sep = "_")
}
# set type, resolution and dimensions of file if to be saved:
device_file <- "png"
res_file <- 300
height_file <- 4 * c(1, 2, 3)
names(height_file) <- c("1", "3", "6")
width_file <- 4 * c(2, 2, 3)
names(width_file) <- c("1", "3", "6")
# get number of dimensions in input:
nb_dim <- ncol(sp_faxes_coord)
# give faxes identity if faxes set to NULL:
if (is.null(faxes)) {
faxes <- colnames(sp_faxes_coord)[1:min(c(4, nb_dim))]
}
# give faxes names if faxes set to NULL:
if (is.null(faxes_nm)) {
faxes_nm <- faxes
}
names(faxes_nm) <- faxes
# get number of axes:
nb_faxes <- length(faxes)
# get combinations of axes on plot:
axes_plot <- utils::combn(faxes, 2)
plot_nb <- ncol(axes_plot)
# range of axes:
user_range <- "ok"
range_sp_coord <- range(sp_faxes_coord)
if (is.na(range_faxes[1]) && is.na(range_faxes[2])) {
user_range <- NA
range_faxes <- range_sp_coord +
c(-1, 1) * (range_sp_coord[2] - range_sp_coord[1]) * 0.05
}
# check that the range is ok if the user chose it and convex hull:
if (! is.na(user_range)) {
if (range_faxes[1] > range_sp_coord[1]) {
stop("The first value of 'range_faxes', is higher than minimum value ",
"of 'sp_faxes_coord' so the convex hull can not be plotted. ",
"Please change the minimal value of 'range_faxes' or set ",
"'plot_ch' to FALSE.")
}
if (range_faxes[2] < range_sp_coord[2]) {
stop("The second value of 'range_faxes', is lower than maximum value ",
"of 'sp_faxes_coord' so the convex hull can not be plotted. ",
"Please change the maximal value of 'range_faxes' or set ",
"'plot_ch' to FALSE.")
}
}
# create a dataframe with species coordinates and option (vertices + label)
# ... if required:
sp_faxes_coord_plot <- data.frame(sp_faxes_coord, label = "")
# if some species names to be plotted, adding a character variable to ...
# ... sp_faxes_coord:
if (! is.null(plot_sp_nm)) {
sp_faxes_coord_plot[plot_sp_nm, "label"] <- plot_sp_nm
}
# get vertices of the convex hull of the species pool:
vert_pool <- fd_details$pool_vert_nm
# retrieve names and weights of species present in each assemblage:
sp_asb1 <- names(which(fd_details$asb_sp_occ[asb1, ] == 1))
if (two_asb){
sp_asb2 <- names(which(fd_details$asb_sp_occ[asb2, ] == 1))
}
# plot FRic if required: ####
if ("fric" %in% ind_nm) {
# list to store ggplot
panels_fric <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# names of axes
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb) {
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool:
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_sp["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
# plot 2D convex hulls and points for the 2 assemblages:
plot_k <- fric.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_vertices_nD = vertices_nD_k,
plot_sp = TRUE,
color_ch = color_ch[c("asb1", "asb2")],
fill_ch = fill_ch[c("asb1", "asb2")],
alpha_ch = alpha_ch[c("asb1", "asb2")],
shape_sp = shape_sp[c("asb1", "asb2")],
size_sp = size_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
shape_vert = shape_sp[c("asb1", "asb2")],
size_vert = size_sp[c("asb1", "asb2")],
color_vert = color_vert[c("asb1", "asb2")],
fill_vert = fill_vert[c("asb1", "asb2")])
# add species names if needed:
if (! is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour= color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fric[[k]] <- plot_k
} # end of k
# plot for indices values: #####
# retrieve values to plot:
top_fric <- c("Functional richness", asb1, "")
values_fric <- c(round(asb_fd_ind[asb1, "fric"], 3), "")
if (two_asb) {
top_fric[3] <- asb2
values_fric[2] <- round(asb_fd_ind[asb2,"fric"], 3)
}
# customize position of texts in the plot
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
# plot window:
x <- NULL
y <- NULL
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fric),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FRic values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FRic", values_fric))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_rect(xmin = range_faxes[1] + spread_faxes*0.10,
xmax = range_faxes[1] + spread_faxes*0.15,
ymin = range_faxes[2] - spread_faxes*0.51,
ymax = range_faxes[2] - spread_faxes*0.55,
fill = color_sp[["asb1"]],
alpha = alpha_ch[["asb1"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.525,
label = paste0("convex hull of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.58,
size = size_sp[["asb1"]], shape = shape_sp[["asb1"]],
color = color_sp[["asb1"]],
fill = fill_sp[["asb1"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("shape of species from", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_rect(xmin = range_faxes[1] + spread_faxes*0.10,
xmax = range_faxes[1] + spread_faxes*0.15,
ymin = range_faxes[2] - spread_faxes*0.64,
ymax = range_faxes[2] - spread_faxes*0.68,
fill = color_sp[["asb2"]],
alpha = alpha_ch[["asb2"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.665,
label = paste0("convex hull of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.71,
size = size_sp[["asb2"]],
shape = shape_sp[["asb2"]],
color = color_sp[["asb2"]],
fill = fill_sp[["asb2"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.71,
label = paste0("shape of species from", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.77,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.48,
y = range_faxes[2] - spread_faxes*0.77,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fric <- panels.to.patchwork(panels_fric, plot_caption)
# title and caption
tit_fric <- paste0("Functional Richness of '", asb1, "'")
if (two_asb){
tit_fric<-paste0(tit_fric, " and '", asb2,"'")
}
# create final patchwork object:
patchwork_fric <- patchwork_fric +
patchwork::plot_annotation(title = tit_fric,
caption = "made with mFD package")
# saving as file or list
if (save_file == TRUE) {
# name of file built with assemblage names and number of dimensions
file_fric <- paste0(nm_asb, "_", "FRic_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fric ,
plot = patchwork_fric,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units= "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fric) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fric[["caption"]] <- plot_caption
panels_fric[["patchwork"]] <- patchwork_fric
list_panels[["fric"]] <- panels_fric
}
} # end of plot FRic
############################################################################
# FDiv plot if required ####
if ("fdiv" %in% ind_nm) {
# create a list to store ggplot:
panels_fdiv <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy)<-c("x", "y")
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
asb_vertG_coord2D_k <- list()
asb_vertG_coord2D_k[["asb1"]] <- fd_details$asb_G_coord[[asb1]][xy_k]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
asb_vertG_coord2D_k[["asb2"]] <- fd_details$asb_G_coord[[asb2]][xy_k]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool:
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
# plot 2D convex hulls and points for the 2 assemblages:
plot_k <- fdiv.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_vertices_nD = vertices_nD_k,
asb_vertG_coord2D = asb_vertG_coord2D_k,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
shape_vert = shape_sp[c("asb1", "asb2")],
color_vert = color_vert[c("asb1", "asb2")],
fill_vert = fill_vert[c("asb1", "asb2")],
shape_vertG = c(asb1 = 23, asb2 = 24),
size_vertG = c(asb1 = 3, asb2 = 3),
color_vertG = color_sp[c("asb1", "asb2")],
fill_vertG = color_sp[c("asb1", "asb2")])
# add species names if needed:
if (! is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# saving plot in a list
panels_fdiv[[k]] <- plot_k
} # end of k
# plot caption ####
# retrieve values to plot:
top_fdiv <- c("Functional Divergence", asb1, "")
values_fdiv <- c(round(asb_fd_ind[asb1, "fdiv"], 3), "")
if (two_asb) {
top_fdiv[3] <- asb2
values_fdiv[2] <- round(asb_fd_ind[asb2,"fdiv"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
# plot window:
x <- NULL
y <- NULL
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour = "black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fdiv),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FDiv values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FDiv", values_fdiv))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = color_sp[["asb1"]],
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.56,
fill = color_sp[["asb1"]],
color = color_sp[["asb1"]],
shape = shape_centroid_fdiv[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.56,
label = paste0("gravity center of the vertices of",
sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.68,
fill = color_sp[["asb2"]],
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.68,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.73,
fill = color_sp[["asb2"]],
color = color_sp[["asb2"]],
shape = shape_centroid_fdiv[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.73,
label = paste0("gravity center of the vertices of",
sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.85,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.85,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# marge panels and caption:
patchwork_fdiv <- panels.to.patchwork(panels_fdiv, plot_caption)
# retrieve title and caption:
tit_fdiv <- paste0( "Functional Divergence of '", asb1, "'")
if (two_asb) {
tit_fdiv <- paste0(tit_fdiv, " and '", asb2,"'")
}
patchwork_fdiv <- patchwork_fdiv +
patchwork::plot_annotation(title = tit_fdiv,
caption = "made with mFD package")
# save as file or in list:
if (save_file == TRUE) {
# name of file built with assemblage names and number of dimensions:
file_fdiv <- paste0(nm_asb, "_", "FDiv_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fdiv ,
plot = patchwork_fdiv,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units= "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption:
names(panels_fdiv) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fdiv[["caption"]] <- plot_caption
panels_fdiv[["patchwork"]] <- patchwork_fdiv
list_panels[["fdiv"]] <- panels_fdiv
}
}# end of plotting FDiv
############################################################################
# FSpe plot if required ####
if ("fspe" %in% ind_nm) {
# create a list to store ggplot:
panels_fspe <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# retrieve coordinates of center of space:
pool_0_xy <- fd_details$pool_O_coord[xy_k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# warn the user: if the asb contains only one species, then can not be
# ... computed:
if (nrow(sp_coord_xy) == 1) {
stop("Plotted assemblage(s) contain(s) only one species, FIde can ",
"not be plotted.")
}
# get a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2,]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- fspe.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
center_coord2D = pool_0_xy,
pool_coord2D = sp_coord_xy,
plot_pool = FALSE,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = color_sp[c("asb1", "asb2")],
color_center = color_centroid_fspe,
fill_center = color_centroid_fspe,
shape_center = shape_centroid_fspe,
size_center = 3,
color_segment = color_sp[c("asb1", "asb2")],
width_segment = c(asb1 = 1, asb2 = 1),
linetype_segment = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fspe[[k]] <- plot_k
} # end of k
# plot caption:
# retrieve values to plot:
top_fspe <- c("Functional Specialisation", asb1, "")
values_fspe <- c(round(asb_fd_ind[asb1, "fspe"], 3), "")
if (two_asb) {
top_fspe[3] <- asb2
values_fspe[2] <- round(asb_fd_ind[asb2,"fspe"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
# plot window:
x <- NULL
y <- NULL
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fspe),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FSpe values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FSpe", values_fspe))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = color_sp[["asb1"]],
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.58,
fill = color_sp[["asb2"]],
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for functional gravity center:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.65,
size = 3,
shape = shape_centroid_fspe,
color = color_centroid_fspe,
fill = color_centroid_fspe) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.65,
label = "gravity center of functional space",
colour = color_centroid_fspe, size = 3)
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.72,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.72,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fspe <- panels.to.patchwork(panels_fspe, plot_caption)
# add title and caption:
tit_fspe <- paste0( "Functional Specialization of '", asb1, "'")
if (two_asb){
tit_fspe <- paste0(tit_fspe, " and '", asb2, "'")
}
patchwork_fspe <- patchwork_fspe +
patchwork::plot_annotation(title = tit_fspe,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_fspe <- paste0(nm_asb, "_", "FSpe_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fspe ,
plot = patchwork_fspe,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fspe) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fspe[["caption"]] <- plot_caption
panels_fspe[["patchwork"]] <- patchwork_fspe
list_panels[["fspe"]] <- panels_fspe
}
} # end of plotting FSpe
############################################################################
# FDis plot if required ####
if ("fdis" %in% ind_nm) {
# create a list to store ggplot:
panels_fdis <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# warn the user: if the asb contains only one species, then can not be
# ... computed:
if (nrow(sp_coord_xy) == 1) {
stop("Plotted assemblage(s) contain(s) only one species, FDis can ",
"not be plotted.")
}
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
asb_fide_coord2D <- list()
asb_fide_coord2D[["asb1"]] <- asb_fd_ind[asb1, paste0("fide", sep = "_",
xy_k)]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
asb_fide_coord2D[["asb2"]] <- asb_fd_ind[asb2, paste0("fide",
sep = "_", xy_k)]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}# end of if 2 assemblages
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- fdis.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_fide_coord2D = asb_fide_coord2D,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
color_fide = color_sp[c("asb1", "asb2")],
fill_fide = fill_sp[c("asb1", "asb2")],
shape_fide = shape_centroid_fdis,
size_fide = c(asb1 = 2, asb2 = 2),
color_segment = color_sp[c("asb1", "asb2")],
width_segment = c(asb1 = 1, asb2 = 1),
linetype_segment = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fdis[[k]] <- plot_k
} # end of k
# plot caption:
# retrieve values to plot:
top_fdis <- c("Functional Dispersion", asb1, "")
values_fdis <- c(round(asb_fd_ind[asb1, "fdis"], 3), "")
if (two_asb) {
top_fdis[3] <- asb2
values_fdis[2] <- round(asb_fd_ind[asb2,"fdis"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
x <- NULL
y <- NULL
# plot window:
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1, 3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fdis),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FDis values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FDis", values_fdis))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = color_sp[["asb1"]],
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.58,
size = 2, shape = shape_centroid_fdis[["asb1"]],
color = color_sp[["asb1"]], fill = fill_sp[["asb1"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("gravity center of",
sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.665,
fill = color_sp[["asb2"]],
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.665,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.735,
size = 2,
shape = shape_centroid_fdis[["asb2"]],
color = color_sp[["asb2"]],
fill = fill_sp[["asb2"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.735,
label = paste0("gravity center of",
sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.80,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.80,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fdis <- panels.to.patchwork(panels_fdis, plot_caption)
# add title and caption:
tit_fdis <- paste0( "Functional Dispersion of '", asb1, "'")
if (two_asb) {
tit_fdis <- paste0(tit_fdis, " and '", asb2, "'")
}
patchwork_fdis <- patchwork_fdis +
patchwork::plot_annotation(title = tit_fdis,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_fdis <- paste0(nm_asb, "_", "FDis_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fdis,
plot = patchwork_fdis,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fdis) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fdis[["caption"]] <- plot_caption
panels_fdis[["patchwork"]] <- patchwork_fdis
list_panels[["fdis"]] <- panels_fdis
}
} # end of plotting FDis
############################################################################
# FIde plot if required ####
if ("fide" %in% ind_nm) {
# create a list to store ggplot:
panels_fide <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# warn the user: if the asb contains only one species, then can not be
# ... computed:
if (nrow(sp_coord_xy) == 1) {
stop("Plotted assemblage(s) contain(s) only one species, FIde ",
"can not be plotted.")
}
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
asb_fide_coord2D <- list()
asb_fide_coord2D[["asb1"]] <- asb_fd_ind[asb1, paste0("fide", sep = "_",
xy_k)]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
asb_fide_coord2D[["asb2"]] <- asb_fd_ind[asb2, paste0("fide",
sep = "_", xy_k)]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}# end of if 2 assemblages
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- fide.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_fide_coord2D = asb_fide_coord2D,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
color_fide = color_sp[c("asb1", "asb2")],
fill_fide = fill_sp[c("asb1", "asb2")],
shape_fide = shape_centroid_fdis,
size_fide = size_sp[c("asb1", "asb2")],
color_segment = color_sp[c("asb1", "asb2")],
width_segment = c(asb1 = 1, asb2 = 1),
linetype_segment = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fide[[k]] <- plot_k
} # end of k
# plot caption:
# retrieve values to plot:
top_fide <- c("Functional Identity", asb1, "")
if (nb_faxes == 2) {
values_fide_PC1 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3),
"")
values_fide_PC2 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3),
"")
values_fide_PC3 <- NULL
values_fide_PC4 <- NULL
}
if (nb_faxes == 3) {
values_fide_PC1 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3),
"")
values_fide_PC2 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3),
"")
values_fide_PC3 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[3])], 3),
"")
values_fide_PC4 <- NULL
}
if (nb_faxes == 4) {
values_fide_PC1 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3),
"")
values_fide_PC2 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3),
"")
values_fide_PC3 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[3])], 3),
"")
values_fide_PC4 <- c(round(asb_fd_ind[asb1,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[4])], 3),
"")
}
if (two_asb) {
top_fide[3] <- asb2
if (nb_faxes == 2) {
values_fide_PC1[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3)
values_fide_PC2[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3)
values_fide_PC3[2] <- NULL
values_fide_PC4[2] <- NULL
}
if (nb_faxes == 3) {
values_fide_PC1[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3)
values_fide_PC2[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3)
values_fide_PC3[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[3])], 3)
values_fide_PC4[2] <- NULL
}
if (nb_faxes == 4) {
values_fide_PC1[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[1])], 3)
values_fide_PC2[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[2])], 3)
values_fide_PC3[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[3])], 3)
values_fide_PC4[2] <- round(asb_fd_ind[asb2,
paste0("fide", sep = "_", colnames(sp_faxes_coord)[4])], 3)
}
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
x <- NULL
y <- NULL
# plot window:
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1, 3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fide),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FIde values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FIde PC1", values_fide_PC1))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FIde PC2", values_fide_PC2))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
if (ncol(sp_faxes_coord) == 3) {
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FIde PC3", values_fide_PC3))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
}
if (ncol(sp_faxes_coord) == 4) {
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FIde PC4", values_fide_PC4))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
}
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.68,
fill = color_sp[["asb1"]],
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.68,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.75,
size = 2, shape = shape_centroid_fdis[["asb1"]],
color = color_sp[["asb1"]],
fill = fill_sp[["asb1"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.75,
label = paste0("gravity center of",
sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.83,
fill = color_sp[["asb2"]],
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.83,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.90,
size = 2,
shape = shape_centroid_fdis[["asb2"]],
color = color_sp[["asb2"]],
fill = fill_sp[["asb2"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.90,
label = paste0("gravity center of",
sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.97,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.97,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fide <- panels.to.patchwork(panels_fide, plot_caption)
# add title and caption:
tit_fide <- paste0( "Functional Identity of '", asb1, "'")
if (two_asb) {
tit_fide <- paste0(tit_fide, " and '", asb2, "'")
}
patchwork_fide <- patchwork_fide +
patchwork::plot_annotation(title = tit_fide,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_fide <- paste0(nm_asb, "_", "FIde_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fide,
plot = patchwork_fide,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fide) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fide[["caption"]] <- plot_caption
panels_fide[["patchwork"]] <- patchwork_fide
list_panels[["fide"]] <- panels_fide
}
} # end of plotting FIde
############################################################################
# FEve plot if required ####
if ("feve" %in% ind_nm) {
# create a list to store ggplot:
panels_feve <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[, xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
asb_mst <- list()
asb_mst[["asb1"]] <- fd_details$asb_mst[[asb1]]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
asb_mst[["asb2"]] <- fd_details$asb_mst[[asb2]]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- feve.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_mst = asb_mst,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
color_mst = color_sp[c("asb1", "asb2")],
width_mst = c(asb1 = 1, asb2 = 1),
linetype_mst = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_feve[[k]] <- plot_k
} # end of k
# retrieve values to plot:
top_feve <- c("Functional Evenness", asb1, "")
values_feve <- c(round(asb_fd_ind[asb1, "feve"], 3), "")
if (two_asb) {
top_feve[3] <- asb2
values_feve[2] <- round(asb_fd_ind[asb2,"feve"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
x <- NULL
y <- NULL
# plot window:
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_feve),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FEve values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FEve", values_feve))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = NA,
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.118,
xend = range_faxes[1] + spread_faxes*0.132,
y = range_faxes[2] - spread_faxes*0.58,
yend = range_faxes[2] - spread_faxes*0.58,
size = 1,
color = color_sp[["asb1"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("mst of",
sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.665,
fill = NA,
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.665,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.118,
xend = range_faxes[1] + spread_faxes*0.132,
y = range_faxes[2] - spread_faxes*0.735,
yend = range_faxes[2] - spread_faxes*0.735,
size = 1,
color = color_sp[["asb2"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.735,
label = paste0("mst of",
sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.80,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.80,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_feve <- panels.to.patchwork(panels_feve, plot_caption)
# add title and caption:
tit_feve <- paste0( "Functional Evenness of '", asb1, "'")
if (two_asb) {
tit_feve <- paste0(tit_feve, " and '", asb2, "'")
}
patchwork_feve <- patchwork_feve +
patchwork::plot_annotation(title = tit_feve,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_feve <- paste0(nm_asb, "_", "FEve_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_feve,
plot = patchwork_feve,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_feve) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_feve[["caption"]] <- plot_caption
panels_feve[["patchwork"]] <- patchwork_feve
list_panels[["feve"]] <- panels_feve
}
} # end of plotting FEve
############################################################################
# FOri plot if required ####
if ("fori" %in% ind_nm) {
# create a list to store ggplot:
panels_fori <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[ , xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
asb_nn_pool <- list()
asb_nn_pool[["asb1"]] <- fd_details$asb_nm_nn_pool[[asb1]]
pool_coord2D <- sp_faxes_coord[, xy_k]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
asb_nn_pool[["asb2"]] <- fd_details$asb_nm_nn_pool[[asb2]]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- fori.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_nn_pool = asb_nn_pool,
pool_coord2D = pool_coord2D,
plot_pool = TRUE,
plot_sp = TRUE,
shape_pool = shape_sp[c("pool")],
size_pool = size_sp[c("pool")],
color_pool = color_sp[c("pool")],
fill_pool = fill_sp[c("pool")],
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
color_segment = color_sp[c("asb1", "asb2")],
width_segment = c(asb1 = 1, asb2 = 1),
linetype_segment = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fori[[k]] <- plot_k
} # end of k
# retrieve values to plot:
top_fori <- c("Functional Originality", asb1, "")
values_fori <- c(round(asb_fd_ind[asb1, "fori"], 3), "")
if (two_asb) {
top_fori[3] <- asb2
values_fori[2] <- round(asb_fd_ind[asb2,"fori"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
x <- NULL
y <- NULL
# plot window:
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fori),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FOri values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FOri", values_fori))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = NA,
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.115,
xend = range_faxes[1] + spread_faxes*0.135,
y = range_faxes[2] - spread_faxes*0.58,
yend = range_faxes[2] - spread_faxes*0.58,
arrow = grid::arrow(length = grid::unit(0.07,
"inches"),
ends = "last",
type = "open"),
size = 1,
color = color_sp[["asb1"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.58,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("nearest neighbour in the global ",
"pool for", sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.665,
fill = NA,
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.665,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.115,
xend = range_faxes[1] + spread_faxes*0.135,
y = range_faxes[2] - spread_faxes*0.735,
yend = range_faxes[2] - spread_faxes*0.735,
arrow = grid::arrow(
length = grid::unit(0.07,"inches"),
ends = "last", type = "open"),
size = 1,
color = color_sp[["asb2"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.58,
y = range_faxes[2] - spread_faxes*0.735,
label = paste0("nearest neighbour in the global",
" pool for", sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.80,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.80,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fori <- panels.to.patchwork(panels_fori, plot_caption)
# add title and caption:
tit_fori <- paste0( "Functional Originality of '", asb1, "'")
if (two_asb) {
tit_fori <- paste0(tit_fori, " and '", asb2, "'")
}
patchwork_fori <- patchwork_fori +
patchwork::plot_annotation(title = tit_fori,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_fori <- paste0(nm_asb, "_", "FOri_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fori,
plot = patchwork_fori,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fori) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fori[["caption"]] <- plot_caption
panels_fori[["patchwork"]] <- patchwork_fori
list_panels[["fori"]] <- panels_fori
}
} # end of plotting FOri
############################################################################
# FNND plot if required ####
if ("fnnd" %in% ind_nm) {
# create a list to store ggplot:
panels_fnnd <- list()
# loop on combinations:
for (k in (1:plot_nb)) {
# get names of axes:
xy_k <- axes_plot[1:2, k]
# get species coordinates along the 2 axes:
sp_coord_xy <- as.matrix(sp_faxes_coord_plot[ , xy_k])
colnames(sp_coord_xy) <- c("x", "y")
# create a list with dataframes for plot:
asb_sp_coord2D_k <- list()
asb_sp_coord2D_k[["asb1"]] <- sp_coord_xy[sp_asb1, ]
asb_sp_relw_k <- list()
asb_sp_relw_k[["asb1"]] <- fd_details$asb_sp_relatw[asb1, sp_asb1]
asb_nn_asb <- list()
asb_nn_asb[["asb1"]] <- fd_details$asb_nm_nn_asb[[asb1]]
vertices_nD_k <- list()
vertices_nD_k[["asb1"]] <- fd_details$asb_vert_nm[[asb1]]
if (two_asb){
asb_sp_coord2D_k[["asb2"]] <- sp_coord_xy[sp_asb2, ]
asb_sp_relw_k[["asb2"]] <- fd_details$asb_sp_relatw[asb2, sp_asb2]
asb_nn_asb[["asb2"]] <- fd_details$asb_nm_nn_asb[[asb2]]
vertices_nD_k[["asb2"]] <- fd_details$asb_vert_nm[[asb2]]
}
# background = axes defined by range of values and names as specified:
plot_k <- background.plot(range_faxes, faxes_nm = xy_k, color_bg)
# add species pool
plot_k <- pool.plot(ggplot_bg = plot_k,
sp_coord2D = sp_coord_xy,
vertices_nD = vert_pool,
plot_pool = TRUE,
color_pool = color_sp["pool"],
fill_pool = fill_ch["pool"],
alpha_ch = alpha_ch["pool"],
color_ch = color_ch["pool"],
fill_ch = fill_ch["pool"],
shape_pool = shape_sp["pool"],
size_pool = size_sp["pool"],
shape_vert = shape_sp["pool"],
size_vert = size_sp["pool"],
color_vert = color_vert["pool"],
fill_vert = fill_vert["pool"])
plot_k <- fnnd.plot(ggplot_bg = plot_k,
asb_sp_coord2D = asb_sp_coord2D_k,
asb_sp_relatw = asb_sp_relw_k,
asb_nn_asb = asb_nn_asb,
plot_sp = TRUE,
shape_sp = shape_sp[c("asb1", "asb2")],
color_sp = color_sp[c("asb1", "asb2")],
fill_sp = fill_sp[c("asb1", "asb2")],
color_segment = color_sp[c("asb1", "asb2")],
width_segment = c(asb1 = 1, asb2 = 1),
linetype_segment = c(asb1 = 1, asb2 = 1))
# add species names if needed:
if (!is.null(plot_sp_nm)) {
x <- NULL
y <- NULL
plot_k <- plot_k +
ggrepel::geom_text_repel(data = sp_faxes_coord_plot,
ggplot2::aes_string(x = xy_k[1],
y = xy_k[2],
label = "label"),
size = size_sp_nm, colour = color_sp_nm,
fontface = fontface_sp_nm,
max.overlaps = Inf,
box.padding = grid::unit(2, 'lines'),
force = 5,
arrow = grid::arrow(
length = grid::unit(0.02, 'npc')),
segment.color = color_sp_nm)
}
# save plot in a list:
panels_fnnd[[k]] <- plot_k
} # end of k
# retrieve values to plot:
top_fnnd <- c("FNND", asb1, "")
values_fnnd <- c(round(asb_fd_ind[asb1, "fnnd"], 3), "")
if (two_asb) {
top_fnnd[3] <- asb2
values_fnnd[2] <- round(asb_fd_ind[asb2,"fnnd"], 3)
}
# customize position of texts in the plot:
spread_faxes <- (range_faxes[2] - range_faxes[1])
hh <- c(1.5, 2.5, 4, 5.5)
vv <- 0.3
x <- NULL
y <- NULL
# plot window:
plot_caption <- ggplot2::ggplot(data.frame(x = range_faxes,
y = range_faxes),
ggplot2::aes(x = x, y = y)) +
ggplot2::scale_x_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::scale_y_continuous(limits = range_faxes, expand = c(0, 0)) +
ggplot2::theme_void() + ggplot2::theme(legend.position = "none") +
ggplot2::geom_rect(xmin = range_faxes[1], xmax = range_faxes[2],
ymin = range_faxes[1], ymax = range_faxes[2],
fill = "white", colour ="black")
# plot names of index and of assemblages:
h <- NULL
v <- NULL
top <- NULL
x <- NULL
y <- NULL
plot_caption <- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[c(1,3:4)],
v = range_faxes[2] - spread_faxes * rep(0.2, 3),
top = top_fnnd),
ggplot2::aes(x = h, y = v, label = top),
size = 3, hjust = 0.5, fontface = "bold")
# plot FNND values:
values_lab <- NULL
data_caption <- data.frame(
h = range_faxes[1] + spread_faxes * 0.15 * hh[2:4],
v = range_faxes[2] - spread_faxes*rep(vv, 3),
values_lab = c("FNND", values_fnnd))
plot_caption <- plot_caption +
ggplot2::geom_text(data = data_caption,
ggplot2::aes(x = h, y = v, label = values_lab),
size = 3, hjust = 0.5, fontface = "plain")
vv <- vv + 0.1
# add text about dimensionality:
nb <- NULL
plot_caption<- plot_caption +
ggplot2::geom_text(data = data.frame(
h = range_faxes[1] + spread_faxes * 0.1,
v = range_faxes[2] - spread_faxes * vv,
nb = paste0("NB: Indices were computed in a ",
nb_dim,"-dimensional space")),
ggplot2::aes(x = h, y = v, label = nb),
size = 3, hjust = 0, fontface = "italic")
# add legend (convex hull, asb species and pool species):
## plot legend:
values_lab <- NULL
### for 1st asb:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.51,
fill = NA,
color = color_sp[["asb1"]],
shape = shape_sp[["asb1"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.51,
label = paste0("relative weight of", sep = " ",
asb1),
colour = color_sp[["asb1"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.115,
xend = range_faxes[1] + spread_faxes*0.135,
y = range_faxes[2] - spread_faxes*0.58,
yend = range_faxes[2] - spread_faxes*0.58,
arrow = grid::arrow(length = grid::unit(0.07,
"inches"),
ends = "last",
type = "open"),
size = 1,
color = color_sp[["asb1"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.58,
y = range_faxes[2] - spread_faxes*0.58,
label = paste0("nearest neighbour in the assemblage ",
"for", sep = " ", asb1),
colour = color_sp[["asb1"]], size = 3)
### if 2nd assemblage:
if (two_asb) {
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.665,
fill = NA,
color = color_sp[["asb2"]],
shape = shape_sp[["asb2"]],
size = 3) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.45,
y = range_faxes[2] - spread_faxes*0.665,
label = paste0("relative weight of", sep = " ",
asb2),
colour = color_sp[["asb2"]], size = 3) +
ggplot2::geom_segment(x = range_faxes[1] + spread_faxes*0.115,
xend = range_faxes[1] + spread_faxes*0.135,
y = range_faxes[2] - spread_faxes*0.735,
yend = range_faxes[2] - spread_faxes*0.735,
arrow = grid::arrow(
length = grid::unit(0.07, "inches"),
ends = "last", type = "open"),
size = 1,
color = color_sp[["asb2"]],
linetype = 1) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.58,
y = range_faxes[2] - spread_faxes*0.735,
label = paste0("nearest neighbour in the ",
"assemblage for", sep = " ", asb2),
colour = color_sp[["asb2"]], size = 3)
}
### for global pool:
plot_caption <- plot_caption +
ggplot2::geom_point(x = range_faxes[1] + spread_faxes*0.125,
y = range_faxes[2] - spread_faxes*0.80,
size = size_sp[["pool"]],
shape = shape_sp[["pool"]],
color = color_sp[["pool"]],
fill = fill_sp[["pool"]]) +
ggplot2::geom_text(x = range_faxes[1] + spread_faxes*0.50,
y = range_faxes[2] - spread_faxes*0.80,
label = "shape of species from the global pool",
colour = color_sp[["pool"]], size = 3)
# arrange panels ####
# merge panels and caption:
patchwork_fnnd <- panels.to.patchwork(panels_fnnd, plot_caption)
# add title and caption:
tit_fnnd <- paste0( "Functional Nearest Neighbour Distance of '",
asb1, "'")
if (two_asb) {
tit_fnnd <- paste0(tit_fnnd, " and '", asb2, "'")
}
patchwork_fnnd <- patchwork_fnnd +
patchwork::plot_annotation(title = tit_fnnd,
caption = "made with mFD package")
# save as file or in a list:
if (save_file == TRUE) {
# get name of file built with assemblage names and number of dimensions:
file_fnnd <- paste0(nm_asb, "_", "FNND_", nb_dim, "D" , ".", device_file)
ggplot2::ggsave(filename = file_fnnd,
plot = patchwork_fnnd,
device = device_file,
scale = 1,
height= height_file[as.character(plot_nb)],
width = width_file[as.character(plot_nb)],
units = "in",
dpi = res_file)
} else {
# output = patchwork + list of panels and caption
names(panels_fnnd) <- paste(axes_plot[1, ], axes_plot[2, ], sep = "_")
panels_fnnd[["caption"]] <- plot_caption
panels_fnnd[["patchwork"]] <- patchwork_fnnd
list_panels[["fnnd"]] <- panels_fnnd
}
} # end of plotting FNND
############################################################################
# return complete output = list of list of panels: ####
return(list_panels)
} # end of function
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.