Skip to content

Commit d17accf

Browse files
author
Matthias Grenié
authored
Merge branch 'main' into update-datasets
2 parents 4aa5b4b + 3c7d5d1 commit d17accf

20 files changed

+546
-97
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export(fb_plot_number_traits_by_species)
3030
export(fb_plot_site_environment)
3131
export(fb_plot_site_traits_completeness)
3232
export(fb_plot_species_traits_completeness)
33+
export(fb_plot_species_traits_missingness)
3334
export(fb_plot_trait_combination_frequencies)
3435
export(fb_plot_trait_correlation)
3536
export(fb_table_trait_summary)

R/fb_get_trait_coverage_by_site.R

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,41 @@ fb_get_trait_coverage_by_site <- function(site_species, species_traits) {
3737
check_site_species(site_species)
3838
check_species_traits(species_traits)
3939

40-
# Remove missing trait data
41-
species_traits <- species_traits[stats::complete.cases(species_traits),]
42-
43-
# Get species in common between both matrices ----
44-
45-
species <- list_common_species(colnames(site_species),
46-
species_traits[["species"]])
47-
48-
49-
# Subset data with common species ----
40+
# Get species in common between both matrices
41+
species <- list_common_species(
42+
colnames(site_species), species_traits[["species"]]
43+
)
5044

51-
species_traits <- species_traits[species_traits[["species"]] %in% species, ,
52-
drop = FALSE]
45+
# Take species with NA into account
46+
species_with_na <- species_traits[["species"]][
47+
!stats::complete.cases(species_traits)
48+
]
49+
species_with_na <- intersect(species_with_na, species)
5350

51+
# Subset data with common species
52+
species_traits <- species_traits[
53+
species_traits[["species"]] %in% species,, drop = FALSE
54+
]
5455

55-
# Count all species (presence/abundance) per site ----
5656

57+
# Count all species (presence/abundance) per site
5758
site_total_abundance <- rowSums(
5859
site_species[ , -1, drop = FALSE], na.rm = TRUE
5960
)
6061

6162

62-
# Count species with traits per site -----
63-
64-
site_cover_abundance <- rowSums(site_species[ , species, drop = FALSE],
65-
na.rm = TRUE)
63+
# Count species with traits per site
64+
if (length(species_with_na) != 0) site_species[, species_with_na] <- 0
65+
site_cover_abundance <- rowSums(
66+
site_species[, species, drop = FALSE], na.rm = TRUE
67+
)
6668

67-
# Compute trait coverage ----
6869

70+
# Compute trait coverage
6971
trait_coverage <- site_cover_abundance / site_total_abundance
7072

7173

72-
# Transforming into tidy format ----
73-
74+
# Transforming into tidy format
7475
data.frame(site = site_species[["site"]],
7576
trait_coverage = trait_coverage,
7677
stringsAsFactors = FALSE)

R/fb_plot_distribution_site_trait_coverage.R

Lines changed: 100 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#' together.
1010
#'
1111
#' @inheritParams fb_get_all_trait_coverages_by_site
12+
#' @inheritParams fb_plot_species_traits_completeness
1213
#'
1314
#' @return a 'ggplot2' object
1415
#'
@@ -18,111 +19,149 @@
1819
#' @importFrom rlang .data
1920
#' @export
2021
fb_plot_distribution_site_trait_coverage <- function(
21-
site_species, species_traits, all_traits = TRUE
22+
site_species, species_traits, species_categories = NULL, all_traits = TRUE
2223
) {
2324

2425
# Checks
2526
check_site_species(site_species)
2627
check_species_traits(species_traits)
28+
check_species_categories(species_categories)
2729

2830
full_coverage <- data.frame(site = rownames(site_species))
2931

30-
# Computing Trait Coverage per Site
31-
if (all_traits) {
32-
full_coverage <- fb_get_trait_coverage_by_site(
33-
site_species, species_traits
32+
33+
# Split species by category
34+
species_split <- list(single_cat = species_traits[["species"]])
35+
category_name <- "single_cat"
36+
37+
if (!is.null(species_categories)) {
38+
39+
category_name <- colnames(species_categories)[2]
40+
41+
species_split <- split(
42+
species_categories[, 1], species_categories[, 2]
3443
)
35-
colnames(full_coverage)[2] <- "all_traits"
44+
3645
}
3746

38-
trait_coverage <- lapply(
39-
colnames(species_traits)[-1],
47+
# Split sites according to species categories
48+
site_species_categories <- lapply(
49+
species_split,
50+
function(x) site_species[, c("site", x), drop = FALSE]
51+
)
52+
53+
# Computing Trait Coverage per Site per category
54+
site_categories_coverage <- lapply(
55+
site_species_categories,
4056
function(x) {
41-
42-
trait_cov2 <- fb_get_trait_coverage_by_site(
43-
site_species, species_traits[, c("species", x)]
57+
site_cat_coverage <- fb_get_all_trait_coverages_by_site(
58+
x, species_traits, all_traits = all_traits
4459
)
4560

46-
colnames(trait_cov2)[2] <- x
47-
48-
return(trait_cov2)
49-
})
50-
51-
# Combine Trait Coverages
52-
trait_coverage <- Reduce(
53-
function(...) merge(..., by = "site", all.x = TRUE), trait_coverage
61+
tidyr::pivot_longer(
62+
site_cat_coverage, -"site", names_to = "coverage_name",
63+
values_to = "coverage_value"
64+
)
65+
}
5466
)
5567

56-
all_coverage <- merge(full_coverage, trait_coverage, by = "site")
57-
all_coverage <- tidyr::pivot_longer(
58-
all_coverage, -"site", names_to = "coverage_name",
59-
values_to = "coverage_value"
68+
# Get average coverage per trait across all sites per category
69+
avg_coverage <- lapply(
70+
site_categories_coverage,
71+
function(single_category) {
72+
site_avg_coverage <- by(
73+
single_category, list(coverage_name = single_category[["coverage_name"]]),
74+
\(y) mean(y$coverage_value, na.rm = TRUE)
75+
)
76+
site_avg_coverage <- utils::stack(site_avg_coverage)
77+
colnames(site_avg_coverage) <- c("avg_coverage", "coverage_name")
78+
79+
return(site_avg_coverage)
80+
81+
}
6082
)
6183

62-
site_order <- by(
63-
all_coverage, all_coverage$site, function(x) mean(x$coverage_value)
84+
# Get categories as a specific column
85+
avg_coverage <- lapply(
86+
names(avg_coverage),
87+
function(single_category_name) {
88+
89+
single_category <- avg_coverage[[single_category_name]]
90+
single_category[[category_name]] <- single_category_name
91+
92+
single_category[, c(3, 2, 1)]
93+
94+
}
6495
)
65-
site_order <- utils::stack(site_order)
96+
avg_coverage <- do.call(rbind, avg_coverage)
6697

67-
coverage_order <- by(
68-
all_coverage, all_coverage$coverage_name, function(x) mean(x$coverage_value)
98+
# Get order of coverage overall
99+
grand_avg_coverage <- utils::stack(
100+
by(avg_coverage, avg_coverage$coverage_name,
101+
\(x) mean(x$avg_coverage, na.rm =TRUE))
69102
)
70-
coverage_order <- utils::stack(coverage_order)
71103

72-
# Reorder sites and traits by average coverage
73-
all_coverage$site <- factor(
74-
all_coverage$site,
75-
levels = site_order[["ind"]][
76-
order(site_order[["values"]], decreasing = TRUE)
104+
# Order coverage categories per decreasing coverage
105+
avg_coverage$coverage_name <- factor(
106+
avg_coverage$coverage_name,
107+
levels = grand_avg_coverage$ind[
108+
order(grand_avg_coverage$values, decreasing = TRUE)
77109
]
78110
)
79111

80-
all_coverage$coverage_name <- factor(
81-
all_coverage$coverage_name,
82-
levels = coverage_order[["ind"]][
83-
order(coverage_order[["values"]], decreasing = TRUE)
84-
]
112+
# Simplify categories
113+
site_categories_coverage <- lapply(
114+
names(site_categories_coverage),
115+
function(x) {
116+
117+
given_coverage <- site_categories_coverage[[x]]
118+
119+
given_coverage[category_name] <- x
120+
121+
return(given_coverage)
122+
}
85123
)
86124

125+
site_categories_coverage <- do.call(rbind, site_categories_coverage)
87126

88-
# Get average coverage per trait
89-
avg_coverage <- by(
90-
all_coverage, all_coverage$coverage_name,
91-
function(x) mean(x$coverage_value)
127+
site_categories_coverage$coverage_name <- factor(
128+
site_categories_coverage$coverage_name,
129+
levels = levels(avg_coverage$coverage_name)
92130
)
93131

94-
avg_coverage <- utils::stack(avg_coverage)
95-
colnames(avg_coverage) <- c("avg_coverage", "coverage_name")
96-
97-
# Produce label per trait with average coverage
98-
avg_coverage[["cov_label"]] <-
99-
with(
100-
avg_coverage,
101-
paste0(coverage_name, "\n(", round(avg_coverage * 100, digits = 1), "%)")
102-
)
103-
104-
avg_coverage <- avg_coverage[, c("cov_label", "coverage_name")]
105-
avg_coverage <- t(utils::unstack(avg_coverage))
106-
107-
108132
if (!is_ggridges_installed()) {
109133
stop("This function requires 'ggridges' to work\n",
110134
"Please run \"install.packages('ggridges')\"", call. = FALSE)
111135
}
112136

113137
# Clean environment
114-
rm(all_traits, coverage_order, full_coverage, site_order, site_species,
115-
species_traits, trait_coverage)
138+
rm(all_traits, site_species, species_traits, grand_avg_coverage)
139+
140+
141+
if (is.null(species_categories)) {
142+
143+
category_facet <- NULL
144+
145+
} else {
146+
147+
category_facet <- ggplot2::facet_wrap(
148+
ggplot2::vars(
149+
!!rlang::sym(category_name))
150+
)
151+
152+
}
153+
116154

117155
# Figure
118156
ggplot2::ggplot(
119-
all_coverage,
157+
site_categories_coverage,
120158
ggplot2::aes(.data$coverage_value, .data$coverage_name)
121159
) +
122160
ggridges::stat_density_ridges(scale = 0.98) +
161+
category_facet +
123162
ggplot2::scale_x_continuous(
124163
"Average Trait Coverage per Site", labels = scales::label_percent()
125164
) +
126-
ggplot2::scale_y_discrete("Trait Name", labels = avg_coverage) +
165+
ggplot2::scale_y_discrete("Trait Name") +
127166
ggplot2::theme_bw()
128167
}

R/fb_plot_site_traits_completeness.R

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,22 @@ fb_plot_site_traits_completeness <- function(
120120
)
121121
)
122122

123-
# Re-order to make sure of coverage is decreasing
123+
# Re-order by coverage to make sure of coverage is decreasing
124124
avg_coverage <- avg_coverage[
125125
order(avg_coverage$avg_coverage, decreasing = TRUE),
126126
]
127127

128+
# Take 'all_traits' into account to make sure it's the last column
129+
if (all_traits) {
130+
all_traits_position = which(avg_coverage$coverage_name == "all_traits")
131+
132+
avg_coverage <- rbind(
133+
avg_coverage[avg_coverage$coverage_name != "all_traits",],
134+
avg_coverage[avg_coverage$coverage_name == "all_traits",]
135+
)
136+
137+
}
138+
128139
# Transform into factor to keep order
129140
avg_coverage$cov_label <- factor(
130141
avg_coverage$cov_label, levels = avg_coverage$cov_label

R/fb_plot_species_traits_completeness.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
#' shows a summary considering if all other traits are known.
1111
#'
1212
#' @inheritParams fb_get_all_trait_coverages_by_site
13-
#' @param species_categories 2-columns `data.frame` giving species categories
14-
#' `NULL` by default, with the first column describing the species name, and
13+
#' @param species_categories (default = `NULL`) 2-columns `data.frame` giving
14+
#' species categories, with the first column describing the species name, and
1515
#' the second column giving their corresponding categories
1616
#'
1717
#' @return a `ggplot2` object

0 commit comments

Comments
 (0)