Stations Vélib’

Données - Ville de Paris

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

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

velib_path <- here::here("data", "paris", "velib-emplacement-des-stations.parquet")
velib <- arrow::read_parquet(velib_path)

n_tot     <- nrow(velib)
n_docks   <- sum(velib$capacity, na.rm = TRUE)
arr_sf    <- arrondissements_sf()
pts_sf    <- velib |>
  dplyr::mutate(geometry = wkb2sfc(coordonnees_geo)) |>
  sf::st_as_sf(crs = 4326)

# Pas de colonne arrondissement dans ce jeu (ni adresse) -> jointure spatiale
# avec le fond de carte des arrondissements ; les stations hors Paris
# intra-muros (réseau Vélib' métropolitain) restent NA.
pts_ar <- sf::st_join(pts_sf, arr_sf["c_ar"], join = sf::st_within)

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())

1519 stations Vélib’, pour 49 271 points d’attache au total (32.4 en moyenne par station) — le réseau métropolitain déborde largement de Paris intra-muros, jusqu’en petite couronne.

Code
velib |>
  dplyr::arrange(dplyr::desc(capacity)) |>
  dplyr::transmute(Station = name, Code = stationcode, Capacité = capacity) |>
  head(8) |>
  gt::gt() |>
  gt::tab_header(title = "8 plus grandes stations") |>
  gt::tab_options(table.width = "100%")
8 plus grandes stations
Station Code Capacité
station humanisée Championnats d'Europe de Natation 32053 211
Station Tour de France 18501 204
Hippodrome de Paris Vincennes 12507 100
Jean Macé - Faidherbe 11007 78
Pau Casals - Neuve Tolbiac 13054 78
Hôpital Européen Georges Pompidou 15104 78
Assemblée Nationale 7009 76
Gare d'Austerlitz - Pont Charles de Gaulle 13125 75

Carte

Code
leaflet::leaflet(pts_sf, options = leaflet::leafletOptions(minZoom = 10)) |>
  paris_basemap() |>
  leaflet::addPolygons(data = arr_sf, fill = FALSE, color = "#999", weight = 1) |>
  leaflet::addCircleMarkers(
    radius = ~pmax(2, pmin(12, sqrt(capacity))), stroke = FALSE,
    fillOpacity = 0.75, fillColor = "#2fa5a5",
    label = ~sprintf("%s — %d points d'attache", name, capacity)
  )

Rayon des cercles ∝ √(capacité).

Par arrondissement (Paris intra-muros)

Code
cnt <- pts_ar |> sf::st_drop_geometry() |> dplyr::filter(!is.na(c_ar)) |>
  dplyr::group_by(c_ar) |> dplyr::summarise(n = dplyr::n(), docks = sum(capacity, na.rm = TRUE), .groups = "drop")

arr_sf |>
  dplyr::left_join(cnt, by = "c_ar") |>
  ggplot() +
  geom_sf(aes(fill = docks), colour = "white", linewidth = 0.2) +
  scale_fill_viridis_c(option = "mako", direction = -1, na.value = "grey92", name = "Points\nd'attache") +
  labs(title = "Capacité Vélib' par arrondissement") +
  theme_carte

Capacité des stations

Code
velib |>
  dplyr::filter(capacity > 0) |>
  ggplot(aes(capacity)) +
  geom_histogram(bins = 30, fill = "#2fa5a5") +
  labs(title = "Distribution de la capacité des stations",
       subtitle = paste0("Médiane : ", median(velib$capacity, na.rm = TRUE), " points d'attache"),
       x = "Capacité (points d'attache)", y = "Stations") +
  theme_barres

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Vélib' — emplacement des stations](https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/information/)",
    "Vélib' Métropole",
    "Open Database License (ODbL)",
    sprintf("`data/paris/velib-emplacement-des-stations.parquet` (%s ko) + `arrondissements.parquet`",
            round(file.size(velib_path) / 1024)),
    format(as.Date(file.mtime(velib_path)), "%d %B %Y"),
    sprintf("%d stations, %s points d'attache", n_tot, format(n_docks, big.mark = " "))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Vélib’ — emplacement des stations
Producteur Vélib’ Métropole
Licence Open Database License (ODbL)
Fichier data/paris/velib-emplacement-des-stations.parquet (67 ko) + arrondissements.parquet
Mise à jour 05 septembre 2026
Observations 1519 stations, 49 271 points d’attache