Autorisations de terrasses et étalages

Données - Ville de Paris

Code
source(here::here("_rinit.R"))
source(here::here("data", "paris", "_paris.R"))   # wkb2sfc(), arrondissements_sf()
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/paris; /usr/local/bin/R -e 'quarto::quarto_render("terrasses-autorisations.qmd")'

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 8, fig.height = 5, dpi = 150)

terr_path <- here::here("data", "paris", "terrasses-autorisations.parquet")
terrasses <- arrow::read_parquet(terr_path) |>
  dplyr::mutate(
    ar = suppressWarnings(as.integer(substr(arrondissement, 4, 5))),
    surface_m2 = longueur * largeur
  )

n_tot      <- nrow(terrasses)
surface_ha <- sum(terrasses$surface_m2, na.rm = TRUE) / 1e4
arr_sf     <- arrondissements_sf()
pts_sf     <- terrasses |>
  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"),
        plot.margin = margin(5, 12, 5, 5))
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())

Chaque autorisation d’occupation du domaine public accordée à un commerce pour une terrasse, un étalage ou une contre-terrasse : 24 238 autorisations, pour environ 22 hectares de trottoirs et places de stationnement occupés.

Code
terrasses |>
  dplyr::filter(!is.na(nom_enseigne)) |>
  dplyr::arrange(dplyr::desc(surface_m2)) |>
  dplyr::transmute(Enseigne = nom_enseigne, Type = typologie, Arrondissement = ar,
                   `Surface (m²)` = round(surface_m2, 1)) |>
  head(8) |>
  gt::gt() |>
  gt::tab_header(title = "8 plus grandes terrasses/étalages") |>
  gt::tab_options(table.width = "100%")
8 plus grandes terrasses/étalages
Enseigne Type Arrondissement Surface (m²)
LA BELLE ROTONDE TERRASSE OUVERTE 19 900.0
BILLY MANGO TERRASSES OUVERTES SUR TROTTOIR 10 720.0
LAND_AND_MONKEYS AMSTERDAM TERRASSES OUVERTES SUR TROTTOIR 9 420.0
BILLY MANGO TERRASSES OUVERTES SUR TROTTOIR 10 240.0
SORA TERRASSE ESTIVALE SUR TROTTOIR FACE À LA DEVANTURE 3 240.0
AMALUNA CONTRE TERRASSE ESTIVALE SUR TROTTOIR FACE À LA DEVANTURE 18 164.6
CHEZ CHARLETTE CONTRE TERRASSE ESTIVALE SUR PLACES ET TERRE-PLEIN 12 152.0
LA GRILLE CONTRE-TERRASSE ESTIVALE SUR VOIE PIÉTONNE 12 144.0

Où sont-elles

Code
ggplot() +
  geom_sf(data = arr_sf, fill = "grey97", colour = "grey70", linewidth = 0.3) +
  geom_hex(data = sf::st_coordinates(pts_sf) |> tibble::as_tibble(),
           aes(X, Y), bins = 65, alpha = 0.9) +
  scale_fill_viridis_c(option = "magma", direction = -1, trans = "sqrt", name = "Autorisations") +
  coord_sf(xlim = sf::st_bbox(arr_sf)[c("xmin", "xmax")],
          ylim = sf::st_bbox(arr_sf)[c("ymin", "ymax")], expand = FALSE) +
  labs(title = "Densité des terrasses et étalages autorisés") +
  theme_carte

Par arrondissement

Code
cnt <- terrasses |> dplyr::filter(!is.na(ar)) |> dplyr::count(ar, name = "n")

arr_sf |>
  dplyr::left_join(cnt, by = c("c_ar" = "ar")) |>
  ggplot() +
  geom_sf(aes(fill = n), colour = "white", linewidth = 0.2) +
  scale_fill_viridis_c(option = "rocket", direction = -1, na.value = "grey92", name = "Autorisations") +
  labs(title = "Terrasses et étalages autorisés par arrondissement") +
  theme_carte

Types d’occupation

Code
terrasses |>
  dplyr::filter(!is.na(typologie)) |>
  dplyr::count(typologie, sort = TRUE) |>
  head(10) |>
  dplyr::mutate(typologie = stringr::str_to_sentence(typologie),
               typologie = forcats::fct_reorder(typologie, n)) |>
  ggplot(aes(n, typologie)) +
  geom_col(fill = "#c0392b", width = 0.65) +
  geom_text(aes(label = n), hjust = -0.2, size = 3) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Types d'autorisation les plus fréquents",
       subtitle = "Terrasses ouvertes et étalages dominent largement", x = NULL, y = NULL) +
  theme_barres

Les enseignes avec le plus d’autorisations

Code
terrasses |>
  dplyr::filter(!is.na(nom_enseigne), nom_enseigne != "") |>
  dplyr::count(nom_enseigne, sort = TRUE) |>
  head(10) |>
  dplyr::mutate(nom_enseigne = forcats::fct_reorder(nom_enseigne, n)) |>
  ggplot(aes(n, nom_enseigne)) +
  geom_col(fill = "#3b6f8a", width = 0.6) +
  geom_text(aes(label = n), hjust = -0.2, size = 3) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Enseignes avec le plus d'autorisations (multi-sites)",
       subtitle = "Chaînes de restauration et de distribution, comptées sur tous leurs points de vente",
       x = NULL, y = NULL) +
  theme_barres

Périodes d’installation

Code
terrasses |>
  dplyr::filter(!is.na(periode_installation)) |>
  dplyr::count(periode_installation, sort = TRUE) |>
  dplyr::mutate(periode_installation = forcats::fct_reorder(periode_installation, n)) |>
  ggplot(aes(n, periode_installation)) +
  geom_col(fill = "#2f6f4f", width = 0.6) +
  geom_text(aes(label = n), hjust = -0.2, size = 3) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Période d'installation autorisée", x = NULL, y = NULL) +
  theme_barres

Toutes les autorisations

Code
terrasses |>
  dplyr::arrange(dplyr::desc(surface_m2)) |>
  dplyr::transmute(Enseigne = nom_enseigne, Type = typologie, Adresse = adresse, Arrondissement = ar,
                   `Surface (m²)` = round(surface_m2, 1), Période = periode_installation) |>
  reactable::reactable(
    searchable = TRUE,
    filterable = TRUE,
    pagination = TRUE,
    defaultPageSize = 20,
    compact = TRUE,
    resizable = TRUE,
    highlight = TRUE,
    wrap = TRUE,
    defaultColDef = reactable::colDef(
      align = "left",
      headerStyle = list(fontWeight = "bold"),
      style = list(whiteSpace = "normal", wordBreak = "break-word")
    ),
    columns = list(
      Enseigne = reactable::colDef(minWidth = 160),
      Type = reactable::colDef(minWidth = 160),
      Adresse = reactable::colDef(minWidth = 200),
      Arrondissement = reactable::colDef(minWidth = 70, maxWidth = 110),
      `Surface (m²)` = reactable::colDef(minWidth = 90, maxWidth = 120, align = "right"),
      Période = reactable::colDef(minWidth = 130)
    )
  )

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Autorisations de terrasses et étalages](https://opendata.paris.fr/explore/dataset/terrasses-autorisations/information/)",
    "Direction de l'Urbanisme — Ville de Paris",
    "Open Database License (ODbL)",
    sprintf("`data/paris/terrasses-autorisations.parquet` (%s ko) + `arrondissements.parquet`",
            round(file.size(terr_path) / 1024)),
    format(as.Date(file.mtime(terr_path)), "%d %B %Y"),
    sprintf("%s autorisations, %s ha", format(n_tot, big.mark = " "), scales::number(surface_ha, 1))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Autorisations de terrasses et étalages
Producteur Direction de l’Urbanisme — Ville de Paris
Licence Open Database License (ODbL)
Fichier data/paris/terrasses-autorisations.parquet (3593 ko) + arrondissements.parquet
Mise à jour 05 septembre 2026
Observations 24 238 autorisations, 22 ha