9
9
# ' together.
10
10
# '
11
11
# ' @inheritParams fb_get_all_trait_coverages_by_site
12
+ # ' @inheritParams fb_plot_species_traits_completeness
12
13
# '
13
14
# ' @return a 'ggplot2' object
14
15
# '
18
19
# ' @importFrom rlang .data
19
20
# ' @export
20
21
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
22
23
) {
23
24
24
25
# Checks
25
26
check_site_species(site_species )
26
27
check_species_traits(species_traits )
28
+ check_species_categories(species_categories )
27
29
28
30
full_coverage <- data.frame (site = rownames(site_species ))
29
31
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 ]
34
43
)
35
- colnames( full_coverage )[ 2 ] <- " all_traits "
44
+
36
45
}
37
46
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 ,
40
56
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
44
59
)
45
60
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
+ }
54
66
)
55
67
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
+ }
60
82
)
61
83
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
+ }
64
95
)
65
- site_order <- utils :: stack( site_order )
96
+ avg_coverage <- do.call( rbind , avg_coverage )
66
97
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 ))
69
102
)
70
- coverage_order <- utils :: stack(coverage_order )
71
103
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 )
77
109
]
78
110
)
79
111
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
+ }
85
123
)
86
124
125
+ site_categories_coverage <- do.call(rbind , site_categories_coverage )
87
126
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 )
92
130
)
93
131
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
-
108
132
if (! is_ggridges_installed()) {
109
133
stop(" This function requires 'ggridges' to work\n " ,
110
134
" Please run \" install.packages('ggridges')\" " , call. = FALSE )
111
135
}
112
136
113
137
# 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
+
116
154
117
155
# Figure
118
156
ggplot2 :: ggplot(
119
- all_coverage ,
157
+ site_categories_coverage ,
120
158
ggplot2 :: aes(.data $ coverage_value , .data $ coverage_name )
121
159
) +
122
160
ggridges :: stat_density_ridges(scale = 0.98 ) +
161
+ category_facet +
123
162
ggplot2 :: scale_x_continuous(
124
163
" Average Trait Coverage per Site" , labels = scales :: label_percent()
125
164
) +
126
- ggplot2 :: scale_y_discrete(" Trait Name" , labels = avg_coverage ) +
165
+ ggplot2 :: scale_y_discrete(" Trait Name" ) +
127
166
ggplot2 :: theme_bw()
128
167
}
0 commit comments