owned this note
owned this note
Published
Linked with GitHub
# INBO CODING CLUB
28 November 2023
Welcome!
## Share your code snippet
If you want to share your code snippet, copy paste your snippet within a section of three backticks (```):
As an **example**:
```
library(tidyverse)
```
(*you can copy paste this example and add your code further down*)
## Yellow sticky notes
No yellow sticky notes online. Put your name + " | " and add a "*" each time you solve a challenge (see below).
## Participants
Name | Challenges
--- | ---
Damiano Oldoni | ***
Pieter Huybrechts |***
Lynn Pallemaerts | ***
Margot Vanhellemont |**
Rhea Maesele | **
Hans Van Calster |
Raïsa Carmen |***
Emma Cartuyvels|*
Frank Huysentruyt |**
Maud Raman |
Siebe Indestege|***
Adriaan Seynaeve |
Lawrence Whatley |
Nele Mullens |
## Challenge 1
### Damiano solution
### Pieter's solution
---
title: "Geese catches in Flanders"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
theme:
version: 4
bootswatch: pulse
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse) # to do datascience
library(here) # to work easily with paths
library(geepack) # to do modelling
library(heatmaply) # to create interactive heatmaps
library(sf) # to work with geospatial vector data
library(leaflet) # to make dynamic maps
library(htmltools) # to make nice html labels for dynamic maps
```
```{r read data, include=FALSE}
catch_fl <- readr::read_csv(
here::here("data", "20231128", "20231128_geese_counts_cleaned.txt"),
na = ""
)
```
Static plots
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### per year and province
```{r}
catch_per_year_province <-
catch_fl %>%
group_by(year, province) %>%
summarize(catched = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched))
ggplot(catch_per_year_province,
aes(x = year, y = catched, fill = province)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Column {.tabset}
-----------------------------------------------------------------------
### per province
```{r}
catch_per_province <- catch_fl %>%
group_by(province) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched_total))
ggplot(catch_per_province,
aes(x = province, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_discrete(breaks = 2012:2018)
```
### per year
```{r}
catch_per_year <- catch_fl %>%
group_by(year) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched_total))
ggplot(catch_per_year,
aes(x = year, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Catch analysis at species level
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### Catches per year and species
```{r}
catch_species <-
catch_fl %>%
group_by(year, commonName) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
arrange(commonName)
ggplot(catch_species,
aes(x = year, y = catched_total, fill = commonName)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Column {data-width=650}
-----------------------------------------------------------------------
```{r include=FALSE}
# Data modelling
species <- unique(catch_fl$commonName)
model_per_species <-
purrr::map(
species,
function(s) {
dfs <- catch_fl %>%
dplyr::filter(commonName == s) %>%
arrange(location, year) %>%
mutate(year = as_factor(as.character(year)),
location = as_factor(location))
geeglm(counts ~ 0 + year,
family = poisson,
data = dfs,
waves = year,
id = location)
})
names(model_per_species) <- species
overview_model <- map(model_per_species, ~summary(.))
overview_gee <- purrr::map2_dfr(
overview_model,
names(overview_model), function(model, name) {
coefficients(model)[,1:2] %>%
rownames_to_column(var = "year") %>%
as_tibble() %>%
mutate(species = name,
year = str_sub(year, start = 5)) %>%
dplyr::select(species, everything())
})
overview_gee <-
overview_gee %>%
mutate(
lwr = exp(Estimate - Std.err),
upr = exp(Estimate + Std.err),
Estimate = exp(Estimate)
)
```
### Modelled data
```{r}
ggplot(overview_gee, aes(x = year, y = Estimate, ymin = lwr, ymax = upr)) +
geom_errorbar(colour = "cyan3") + geom_point(colour = "cyan4") +
facet_grid(.~species) +
xlab("year") + ylab("Estimated number of geese per location") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 9))
```
Maps
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
## Heatmap
```{r}
n_catches_per_location <- catch_fl %>%
group_by(location) %>%
summarise(counts = sum(.data$counts, na.rm = TRUE),
catches = sum(.data$catched, na.rm = TRUE)) %>%
as.data.frame()
row.names(n_catches_per_location) <- n_catches_per_location$location
n_catches_per_location$location <- NULL
heatmaply(n_catches_per_location, dendrogram = "none")
```
Column {data-width=650}
-----------------------------------------------------------------------
## Leaflet map
Total number of catches per province
```{r}
pr_fl <- sf::st_read(
here::here("data", "20231128" ,"20231128_flemish_provinces.gpkg"),
quiet = TRUE
)
pr_fl <- pr_fl %>%
dplyr::left_join(catch_per_province,
by = c("TX_PROV_DESCR_NL" = "province"))
#
bins <- seq(0, 6000, by = 1000)
pal <- colorBin("YlOrRd", domain = pr_fl$catched_total, bins = bins)
labels <- sprintf(
"<strong>%s</strong><br/>%g catches",
pr_fl$TX_PROV_DESCR_NL, pr_fl$catched_total
) %>% lapply(HTML)
map_catch_pr <- leaflet(pr_fl, width = 750) %>%
addTiles() %>%
addPolygons(
fillColor = ~pal(catched_total),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlightOptions = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(position = "bottomright",
pal = pal,
values = ~catched_total)
map_catch_pr
```
## Challenge 2
### Pieter's Solution
```r
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Catches"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
radioButtons(inputId = "provinces",
label = "Province",
choices =
c("Antwerpen",
"Limburg",
"Oost-Vlaanderen",
"Vlaams-Brabant"),
selected = "Oost-Vlaanderen"),
selectInput(
inputId = "species",
label = "Species",
choices =
c("Nijlgans",
"Grauwe gans",
"Soepgans",
"Canadese gans",
"Brandgans"),
selected = "Canadese gans"
)
),
# Show a plot of the generated distribution
mainPanel(
textOutput("simple_text")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$simple_text <-
renderText(paste("You have selected the province",
input$provinces,
"and the species",
input$species))
}
# Run the application
shinyApp(ui = ui, server = server)
```
## Challenge 3
### Lynn:
```r
library(shiny)
library(tidyverse)
catch_fl <- readr::read_csv("./data/20231128_geese_counts_cleaned.txt")
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Geese catches in Flanders"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
radioButtons(inputId = "province",
label = "Provincie",
choices = c("Vlaams-Brabant", "Antwerpen",
"Oost-Vlaanderen",
"West-Vlaanderen", "Limburg"),
selected = "Oost-Vlaanderen"),
selectInput(inputId = "species",
label = "Soort",
choices = c("Brandgans", "Canadese gans",
"Grauwe gans",
"Nijlgans", "Soepgans"),
selected = "Canadese gans")
),
# Show a plot of the generated distribution
mainPanel(
textOutput("selected_var"),
plotOutput("catch_per_year")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$selected_var <- renderText({
paste0("You have selected ", input$species, " in the province ", input$province, ".")
})
output$catch_per_year <- renderPlot({
catch_per_year <- catch_fl %>%
filter(province == input$province) %>%
filter(commonName == input$species) %>%
group_by(year) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched_total))
ggplot(catch_per_year,
aes(x = year, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
})
}
# Run the application
shinyApp(ui = ui, server = server)
```
### Pieter's Solution:
https://pieterhuybrechts.shinyapps.io/my-first-shiny-app/
```r
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
library(tidyverse)
catch_fl <- read_csv("data/20231128_geese_counts_cleaned.txt", na = "")
# provinces
provinces <- unique(catch_fl$province)
# species
species <- unique(catch_fl$commonName)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Catches"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
radioButtons(inputId = "provinces_radio",
label = "Province",
choices = provinces,
selected = "Oost-Vlaanderen"),
selectInput(
inputId = "species_select",
label = "Species",
choices = species,
selected = "Canadese gans"
)
),
# Show a plot of the generated distribution
mainPanel(
textOutput("simple_text"),
plotOutput("histoplot")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$simple_text <-
renderText(paste("You have selected the province",
input$provinces_radio,
"and the species",
input$species_select))
output$histoplot <-
renderPlot(
catch_fl %>%
filter(commonName == input$species_select,
province == input$provinces_radio) %>%
group_by(year) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
ggplot(aes(x = year, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018) +
labs(title = paste("Catches of", input$species_select, "in", input$provinces_radio))
)
}
# Run the application
shinyApp(ui = ui, server = server)
```
### Emma (met crosstalk en flexdashboard):
```
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse) # to do datascience
library(here) # to work easily with paths
library(geepack) # to do modelling
library(heatmaply) # to create interactive heatmaps
library(sf) # to work with geospatial vector data
library(leaflet) # to make dynamic maps
library(htmltools) # to make nice html labels for dynamic maps
library(crosstalk)
```
```{r}
catch_fl <- readr::read_csv(
here::here("data", "20231128", "20231128_geese_counts_cleaned.txt"),
na = ""
)
```
Overview
=====================================
Column {data-width=650}
-----------------------------------------------------------------------
### Catch per year and province
```{r}
catch_per_year_province <-
catch_fl %>%
group_by(year, province) %>%
summarize(catched = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched))
ggplot(catch_per_year_province,
aes(x = year, y = catched, fill = province)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Column {.tabset}
-----------------------------------------------------------------------
### Catch per province
```{r}
catch_per_province <- catch_fl %>%
group_by(province) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched_total))
ggplot(catch_per_province,
aes(x = province, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_discrete(breaks = 2012:2018)
```
### Catch per year
```{r}
catch_per_year <- catch_fl %>%
group_by(year) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
ungroup() %>%
arrange(desc(catched_total))
ggplot(catch_per_year,
aes(x = year, y = catched_total)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Catch analysis at species level
=====================================
Column {data-width=650}
-----------------------------------------------------------------------
### Chart 1
```{r}
catch_species <-
catch_fl %>%
group_by(year, commonName) %>%
summarize(catched_total = sum(catched, na.rm = TRUE)) %>%
arrange(commonName)
ggplot(catch_species,
aes(x = year, y = catched_total, fill = commonName)) +
geom_bar(stat = 'identity') +
scale_x_continuous(breaks = 2012:2018)
```
Column {data-width=650}
-----------------------------------------------------------------------
```{r}
species <- unique(catch_fl$commonName)
model_per_species <-
purrr::map(
species,
function(s) {
dfs <- catch_fl %>%
dplyr::filter(commonName == s) %>%
arrange(location, year) %>%
mutate(year = as_factor(as.character(year)),
location = as_factor(location))
geeglm(counts ~ 0 + year,
family = poisson,
data = dfs,
waves = year,
id = location)
})
names(model_per_species) <- species
overview_model <- map(model_per_species, ~summary(.))
overview_gee <- purrr::map2_dfr(
overview_model,
names(overview_model), function(model, name) {
coefficients(model)[,1:2] %>%
rownames_to_column(var = "year") %>%
as_tibble() %>%
mutate(species = name,
year = str_sub(year, start = 5)) %>%
dplyr::select(species, everything())
})
overview_gee <-
overview_gee %>%
mutate(
lwr = exp(Estimate - Std.err),
upr = exp(Estimate + Std.err),
Estimate = exp(Estimate)
)
```
### Chart 2
```{r}
ggplot(overview_gee, aes(x = year, y = Estimate, ymin = lwr, ymax = upr)) +
geom_errorbar(colour = "cyan3") + geom_point(colour = "cyan4") +
facet_grid(.~species) +
xlab("year") + ylab("Estimated number of geese per location") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 9))
```
Maps
=====================================
Column {data-width=650}
-----------------------------------------------------------------------
### Chart 1
```{r}
n_catches_per_location <- catch_fl %>%
group_by(location) %>%
summarise(counts = sum(.data$counts, na.rm = TRUE),
catches = sum(.data$catched, na.rm = TRUE)) %>%
as.data.frame()
row.names(n_catches_per_location) <- n_catches_per_location$location
n_catches_per_location$location <- NULL
heatmaply(n_catches_per_location, dendrogram = "none")
```
Column {data-width=650}
-----------------------------------------------------------------------
### Chart 2
```{r, include=FALSE}
pr_fl <- sf::st_read(
here::here("data", "20231128" ,"20231128_flemish_provinces.gpkg")
)
pr_fl <- pr_fl %>%
dplyr::left_join(catch_per_province,
by = c("TX_PROV_DESCR_NL" = "province"))
```
```{r}
bins <- seq(0, 6000, by = 1000)
pal <- colorBin("YlOrRd", domain = pr_fl$catched_total, bins = bins)
labels <- sprintf(
"<strong>%s</strong><br/>%g catches",
pr_fl$TX_PROV_DESCR_NL, pr_fl$catched_total
) %>% lapply(HTML)
map_catch_pr <- leaflet(pr_fl) %>%
addTiles() %>%
addPolygons(
fillColor = ~pal(catched_total),
weight = 2,
opacity = 1,
color = "white",
dashArray = "3",
fillOpacity = 0.7,
highlightOptions = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(position = "bottomright",
pal = pal,
values = ~catched_total)
map_catch_pr
```
Choose your own adventure
=====================================
Column {data-width=650}
-----------------------------------------------------------------------
### Choose variables
```{r}
shared_geese <- SharedData$new(catch_fl)
filter_checkbox(id = "province",
label = "Provincie",
sharedData = shared_geese,
group = ~province)
filter_select(id = "commonName",
label = "Soort",
sharedData = shared_geese,
group = ~commonName)
```
Column {data-width=650}
-----------------------------------------------------------------------
### Histogram
```{r}
plot_ly(shared_geese,
x = ~year,
y = ~counts,
color = ~commonName,
type = "bar") %>%
layout(barmode = "stack")
```
```