source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
invisible(Sys.setenv(TZ = "Europe/Paris"))
# cd ~/iCloud/website/data/paris; /usr/local/bin/R -e 'quarto::quarto_render("arbres-abattus-pour-raison-sanitaires-et-essence-de-remplacement.qmd")'
# sh ~/iCloud/website/website_short.sh
library(lubridate)
source(here::here("data", "paris", "_paris.R")) # wkb2sfc(), paris_basemap()
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
fig.width = 8, fig.height = 4.6, dpi = 150)
P <- here::here("data", "paris")
abattus_path <- file.path(P, "arbres-abattus-pour-raison-sanitaires-et-essence-de-remplacement.parquet")
abattus <- arrow::read_parquet(abattus_path)
arrondissements <- arrow::read_parquet(file.path(P, "arrondissements.parquet"))
# Motif d'abattage : ~12 phrases-types -> libellé court (détection par mots-clés,
# robuste aux retouches de rédaction) + regroupement en 4 grandes causes.
motif_court <- function(x) {
dplyr::case_when(
stringr::str_detect(x, stringr::regex("déclin physiologique", ignore_case = TRUE)) ~ "Déclin physiologique irréversible",
stringr::str_detect(x, stringr::regex("partie aérienne.*lignivores|houppier.*délitement", ignore_case = TRUE)) ~ "Pourriture / cavités du houppier",
stringr::str_detect(x, stringr::regex("ancrage ou le système racinaire", ignore_case = TRUE)) ~ "Pourriture racinaire / ancrage",
stringr::str_detect(x, stringr::regex("épisode climatique", ignore_case = TRUE)) ~ "Épisode climatique (tempête, crue)",
stringr::str_detect(x, stringr::regex("chocs, feu, pollution", ignore_case = TRUE)) ~ "Chocs, feu, pollution, vandalisme",
stringr::str_detect(x, stringr::regex("Jeune arbre dépérissant", ignore_case = TRUE)) ~ "Échec de reprise après plantation",
stringr::str_detect(x, stringr::regex("défauts structurels propres", ignore_case = TRUE)) ~ "Défauts structurels propres",
stringr::str_detect(x, stringr::regex("désordres aux structures", ignore_case = TRUE)) ~ "Désordres aux trottoirs / sépultures",
stringr::str_detect(x, stringr::regex("lutte obligatoire", ignore_case = TRUE)) ~ "Pathogène réglementé (lutte obligatoire)",
stringr::str_detect(x, stringr::regex("manque de lumière", ignore_case = TRUE)) ~ "Dépérissement par manque de lumière",
stringr::str_detect(x, stringr::regex("section des racines|tranchées, excavations", ignore_case = TRUE)) ~ "Travaux à proximité (tranchées…)",
is.na(x) ~ "Non précisé",
TRUE ~ "Autre"
)
}
cause_large <- function(motif) {
dplyr::case_when(
motif %in% c("Pourriture / cavités du houppier", "Pourriture racinaire / ancrage",
"Pathogène réglementé (lutte obligatoire)") ~ "Agents pathogènes (pourriture)",
motif %in% c("Déclin physiologique irréversible", "Dépérissement par manque de lumière",
"Échec de reprise après plantation") ~ "Déclin physiologique",
motif == "Épisode climatique (tempête, crue)" ~ "Épisode climatique",
TRUE ~ "Structurel & divers"
)
}
abattus <- abattus |>
dplyr::mutate(
date = as.Date(datedernierabattage),
mois = lubridate::floor_date(date, "month"),
motif = motif_court(motifabattagearbreprecedent),
cause = cause_large(motif),
ar_num = suppressWarnings(as.integer(stringr::str_extract(arrondissement, "\\d+"))),
ar_num = dplyr::if_else(stringr::str_detect(arrondissement, "PARIS"), ar_num, NA_integer_),
genre_abattu = stringr::str_to_title(genrearbreprecedent),
genre_futur = stringr::str_to_title(genrefutur),
espece_fr = stringr::str_to_sentence(libellefrancaisarbreprecedent),
remplacement_connu = !is.na(genrefutur),
meme_genre = remplacement_connu & (genre_abattu == genre_futur)
)
n_tot <- nrow(abattus)
date_min <- format(min(abattus$date), "%d %B %Y")
date_max <- format(max(abattus$date), "%d %B %Y")
arr_sf <- arrondissements |>
dplyr::transmute(c_ar, nom = l_aroff, geometry = wkb2sfc(geom)) |>
sf::st_as_sf(crs = 4326)
pts_sf <- abattus |>
dplyr::mutate(geometry = wkb2sfc(geo_point_2d)) |>
sf::st_as_sf(crs = 4326)
theme_carte <- theme_void(base_size = 12) +
theme(plot.title = element_text(face = "bold"),
plot.subtitle = element_text(colour = "grey35"),
legend.position = "right")
theme_barres <- theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"),
plot.subtitle = element_text(colour = "grey35"),
panel.grid.major.y = element_blank())
pal_cause <- c(
"Déclin physiologique" = "#4c6d3b",
"Agents pathogènes (pourriture)" = "#8a5a2b",
"Épisode climatique" = "#2f6f9f",
"Structurel & divers" = "#8a8a8a"
)