---
title: "Introductiewegen en aantallen van uitheemse soorten in Vlaanderen"
date: "2025-11-20T10:00:00"
bibliography: "../references.bib"
link-citations: TRUE
thema:  
  - Invasieve soorten
  - Flora & fauna
keywords:
  - uitheemse soorten
lang: nl
tab: indicator
verantwoordelijke:
  - Tim Adriaens <tim.adriaens@inbo.be>
  - Sander Devisscher <sander.devisscher@inbo.be>
  - Damiano Oldoni <damiano.oldoni@inbo.be>
output: html_document
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  echo = FALSE
)
library(tidyverse)
library(git2rdata)
library(plotly)
source(file.path("..", "..", "inbo_theme.R"))
library(htmlwidgets)
library(trias)
set.seed(20200520)
setWidgetIdSeed(20200520)
options(htmlwidgets.TOJSON_ARGS = list(pretty = TRUE))
conflicted::conflicts_prefer(dplyr::filter, plotly::layout)
```

```{r data_inlezen, include = FALSE}
data <- read_vc("ias_pathways")
```

Ontsnappingen van huisdieren, van planten uit de horticultuur (bv. via het storten van tuinafval) of uit botanische tuinen, van dieren uit dierenparken of aquaria zijn een belangrijke bron van nieuwe introducties.

```{r hoofdfiguur prep, include=FALSE}
kingdom_info <- data %>%
  distinct(key, kingdom) %>%
  mutate(kingdom = case_when(kingdom == "Animalia" ~ "Dieren",
                             kingdom == "Plantae" ~ "Planten",
                             TRUE ~ "Andere"))

p <- visualize_pathways_level1(df = data,
                               x_lab = "Aantal geïntroduceerde taxa",
                               y_lab = "Introductiewegen")

p_nl <- p

p_nl$plot$data <-  p_nl$plot$data %>%
  mutate(pathway_level1 = recode(
    pathway_level1,
    "contaminant" = "transportbesmetting",
    "unknown" = "onbekend",
    "escape" = "ontsnapping",
    "release" = "uitzetting",
    "stowaway" = "transportverstekeling",
    "corridor" = "corridor",
    "unaided" = "autonome uitbreiding")) %>%
  left_join(kingdom_info, by = c("taxonKey" = "key")) %>%
  filter(kingdom != "Andere")

p_nl$plot <- p_nl$plot + aes(fill = kingdom) +
  guides(fill = guide_legend(reverse = TRUE)) +
  scale_fill_discrete(name = "Soortengroep") +
  theme(legend.position = "bottom")

# enkel slot plot nodig
p_nl <- p_nl$plot
```

```{r visualisatie hoofdfiguur}
if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  ggplotly(p_nl, dynamicTicks = TRUE) %>%
    layout(yaxis = list(rangemode = "tozero")) %>%
    plotly::config(
      modeBarButtonsToRemove = list(
        "lasso2d", "select2d", "hoverClosestCartesian",
        "hoverCompareCartesian", "toggleSpikelines"
      ),
      displaylogo = FALSE
    )
} else {
  p_nl
}
```

```{r export pathways, include=FALSE, eval=FALSE}
ggsave(file.path(".", "dump", "pathways.eps"),
       plot = p_nl,
       dpi = 300)
```

## Definitie

De indicator toont het aantal uitheemse planten- en diersoorten dat via een bepaalde introductieweg in Vlaanderen terechtkomt. Voor deze indicator werd de beschikbare informatie over introductiewegen ingedeeld volgens de standaard van de Conventie Biologische Diversiteit [@RN3437; @RN8262; @RN4112]. De gegevens waren tot 2018 gebaseerd op INBO data, maar zijn vanaf 2019 gebaseerd op de voor Vlaanderen beschikbare gegevens in de officiële Belgische checklist van uitheemse soorten [@RN4113].

## Bespreking

Uitheemse soorten zijn soorten die niet van nature in Vlaanderen voorkomen maar door menselijke activiteit in Vlaanderen zijn terechtgekomen. 
Onder introductiewegen (pathways) worden zowel de vectoren die een organisme meedragen, als de route waarlangs soorten binnenkomen, begrepen. 
Voor deze indicator werd de beschikbare informatie over introductiewegen ingedeeld volgens de standaard van de Conventie Biologische Diversiteit [@RN3437; @RN8262; @RN4112].
Hulme et al. [-@RN8506] onderscheiden vijf introductiemechanismen voor uitheemse soorten: uitzetting, ontsnapping, transportbesmetting, transportverstekeling en corridor. 
Daarnaast is er autonome uitbreiding van een soort vanuit een ander gebied waar de soort eveneens uitheems is.

Sinds 1 januari 2015 is de Europese verordening (1143/2014) inzake de preventie en het beheer van invasieve uitheemse soorten van kracht.
De Verordening legt Vlaanderen regels op voor preventie van nieuwe introducties via de controle op onopzettelijke introductiewegen. Ze verplicht de lidstaten een analyse uit te voeren van de prioritaire introductiewegen van exoten.

Ondertussen werd deze analyse van introductiewegen uitgevoerd door de Belgische wetenschappelijke raad Invasieve Uitheemse Soorten ([@NationalScientificSecretariatIAS2018]) en zijn actieplannen voor prioritaire onopzettelijke introductiewegen van Unielijst exoten in voorbereiding.

Op basis van het aantal soorten zijn de belangrijkste onopzettelijke introductiewegen van invasieve exoten ontsnappingen en transportbesmettingen. Bij ontsnappingen gaat het over planten uit de horticultuur (bv. via het storten van tuinafval), uit botanische tuinen, ontsnapte huisdieren en dieren uit dierenparken en uit aquaria.
Daarnaast zijn er introducties door de onbedoelde verplaatsing van levende organismen als contaminanten van goederen (bv. zaden, grondverzet, levend aas, hout).
Verschillende soorten bereikten Vlaanderen ook op eigen kracht vanuit populaties in omliggende regio’s.
Voor aquatische diersoorten vormen onbedoelde introducties bij visbepotingen een aandachtspunt, voor waterplanten de aquariumhouderij.

### Trend in het aantal introducties van uitheemse soorten

Door een toenemende globalisering is het aantal uitheemse soorten in de natuur in Vlaanderen de laatste decennia exponentieel gestegen. 
Deze toename is zichtbaar in alle ecosystemen. Sommige uitheemse soorten verspreiden zich invasief en kunnen daarmee de inheemse biodiversiteit verstoren. 

```{r prep temporele_component, include = FALSE}
habitats <- c("freshwater", "marine", "terrestrial")
ts <- as.data.frame(seq(from = 1920,
                        to = max(data$first_observed, na.rm = TRUE))) %>%
  rename(first_observed = 1)

temporal_data <- data.frame()

for (h in habitats) {
  hab_data <- data %>%
    select(-kingdom) %>%
    left_join(kingdom_info, by = "key") %>%
    filter(kingdom != "Andere",
      !is.na(first_observed),
           grepl(h, habitat)) %>%
    mutate(habitat = h) %>%
    group_by(habitat, first_observed, pathway_level1, kingdom) %>%
    summarise(n = n_distinct(speciesKey))

  hab_ts <- ts %>%
    left_join(hab_data) %>%
    mutate(habitat = h) %>%
    mutate(n = case_when(is.na(n) ~ as.double(0),
                         TRUE ~ as.double(n)),
           cum = cumsum(n)) %>%
    mutate(habitat = recode(habitat,
                            "freshwater" = "zoetwater",
                            "marine" = "marien",
                            "terrestrial" = "terrestrisch"
    ))

  if (nrow(temporal_data) == 0) {
    temporal_data <- hab_ts
  } else {
    temporal_data <- rbind(temporal_data, hab_ts)
  }
}

temporal_data_cum <- temporal_data %>%
  group_by(first_observed) %>%
  summarise(n = sum(n, na.rm = TRUE)) %>%
  mutate(cum = cumsum(n)) %>%
  mutate(kingdom = "Totaal")

kingdoms <- c("Dieren", "Planten")

for (k in kingdoms) {
  kingdom_data_sub <- temporal_data %>%
    filter(kingdom == k) %>%
    group_by(first_observed) %>%
    right_join(ts, by = "first_observed") %>%
    summarise(n = sum(n, na.rm = TRUE)) %>%
    mutate(cum = cumsum(n),
           kingdom = k)

  temporal_data_cum <- rbind(temporal_data_cum, kingdom_data_sub)
}

temporal_data_cum2 <- temporal_data %>%
  filter(!is.na(habitat)) %>%
  group_by(habitat, first_observed) %>%
  summarise(n = sum(n, na.rm = TRUE)) %>%
  mutate(cum = cumsum(n)) %>%
  mutate(kingdom = "Totaal")

habitats_nl <- c("zoetwater", "marien", "terrestrisch")
hab_ts2 <- data.frame()

for (h in habitats_nl) {
  ts2 <- ts %>%
    mutate(habitat = h)

  if (nrow(hab_ts2) == 0) {
    hab_ts2 <- ts2
  } else {
    hab_ts2 <- rbind(hab_ts2, ts2)
  }
}

for (k in kingdoms) {

  kingdom_data_sub2 <- temporal_data %>%
    filter(kingdom == k,
           !is.na(habitat)) %>%
    right_join(hab_ts2, by = c("first_observed", "habitat")) %>%
    group_by(habitat, first_observed) %>%
    summarise(n = sum(n, na.rm = TRUE)) %>%
    mutate(cum = cumsum(n),
           kingdom = k)

  temporal_data_cum2 <- rbind(temporal_data_cum2, kingdom_data_sub2)
}
```

```{r code temporele_component, include=FALSE}
p <- temporal_data_cum %>%
  ggplot(aes(x = first_observed,
             y = cum,
             color = kingdom)) +
  geom_line() +
  labs(color = "Soortengroep") +
  xlab("Jaar") +
  ylab("Aantal geïntroduceerde uitheemse soorten")

p_2 <- temporal_data_cum2 %>%
  ggplot(aes(x = first_observed,
             y = cum,
             color = habitat)) +
  geom_line() +
  xlab("Jaar") +
  ylab("Aantal geïntroduceerde uitheemse soorten") +
  facet_wrap(~kingdom, nrow = n_distinct(temporal_data$habitat),
             scales = "fixed") +
  theme(legend.position = "bottom")
```

```{r}
if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  ggplotly(p, dynamicTicks = TRUE) %>%
    layout(yaxis = list(rangemode = "tozero")) %>%
    plotly::config(
      modeBarButtonsToRemove = list(
        "lasso2d", "select2d", "hoverClosestCartesian",
        "toggleSpikelines"
      ),
      displaylogo = FALSE
    )
} else {
  p
}
```

```{r}
if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  ggplotly(p_2, dynamicTicks = FALSE) %>%
    add_annotations(tex = "Habitat", xref = "paper", yref = "paper",
                    x = -0.1,
                    y = -0.2, yanchor = "bottom",    # Same y as legend below
                    legendtitle = TRUE, showarrow = FALSE) %>%
    layout(yaxis = list(rangemode = "tozero"),
           legend = list(orientation = "h",
                         y = -0.1,
                         x = 0.1)) %>%
    plotly::config(
      modeBarButtonsToRemove = list(
        "lasso2d", "select2d", "hoverClosestCartesian",
        "toggleSpikelines"
      ),
      displaylogo = FALSE
    )
} else {
  p_2
}
```

```{r export temporele_component, include=FALSE, eval=FALSE}
ggsave(file.path(".", "dump", "temporele_component_1.eps"),
       plot = p,
       dpi = 300)
ggsave(file.path(".", "dump", "temporele_component_2.eps"),
       plot = p_2,
       dpi = 300)
```

## Referenties
