---
title: "Subventions pour l’installation d’infrastructures de recharge pour véhicules électriques"
lang: fr
subtitle: "Nombre et montants des subventions demandées, promises et payées, Vaud"
author: "DGE-DIREN"
date: last-modified # Renvoie automatiquement la date de dernière modification du .qmd
params: # ! `open_params_metadata_help()` pour des instructions de remplissage détaillées
fonction: 1 # Valeur numérique : 0=Non-défini/1=Description/2=Orientation/3=Pilotage
nature: 1 # Valeur numérique : 0=Non-défini/1=Actions/2=Effets/3=Impacts
idThematique: 08.05.03.21 # Identifiant selon nomenclature obsind theme/sous-theme/objet/id (p.ex. 08.03.01)
niveauPublication: 2 # Valeur numérique : 0=Non-défini/1=Interne/2=Public. Tout autre choix génère un avertissement
niveauDetail: Subvention # Texte libre qui indique le niveau minimal d'agrégation disponible pour l'indicateur (canton, commune, région, installation, véhicule, etc.)
frequenceMAJ: Annuel # Texte libre, idéalement à choisir parmi les codes suivants : mensuel/semestriel/annuel/biannuel/mensuel/tous les x ans/non-défini
moisMAJ: 2 # Valeur numérique : 0=Non-défini/1=Janvier/2=Février, etc.
disponibleDepuis: 2021 # Valeur numérique Année (aaaa) (p.ex. 2000)
personneReference: Steve Ducommun # Prénom+Nom de la personne référente de l'indicateur
mailReference: stat.energie@vd.ch # E-mail ACV (générique ou nominal, se terminant par @vd.ch)
uuid: aacc07ed-4c37-420f-b8d4-1e2305b97529 # !NE PAS MODIFIER! Identifiant unique généré automatiquement à la création de la fiche
uuidParent: null # Identifiant(s) unique(s) des indicateurs parents de l'indicateur actuel (format uuid avec séparateur '/' si plusieurs uuid)
uuidEnfant: null # Identifiant(s) unique(s) des indicateurs enfants de l'indicateur actuel (format uuid avec séparateur '/' si plusieurs uuid)
uuidConnexe: null # Identifiant(s) unique(s) des indicateurs connexes à l'indicateur actuel (format uuid avec séparateur '/' si plusieurs uuid)
majCatalogue: 1 # Valeur numérique : 0=Non/1=Oui pour mettre à jour les métadonnées dans le catalogue des indicateurs (connexion au disque partagé ObsInd requise)
format:
html:
other-links: # Copier la structure ci-dessous pour remplacer/ajouter d'autres liens sous la table des matières
- text: Infos statistiques énergie
href: 'https://www.vd.ch/environnement/energie/chiffres-cles-et-statistiques-energie-vaud/'
target: '_blank'
- text: Profil climatique communes
href: 'https://stat-climat-vd.ch/profil-climat/'
target: '_blank'
- text: Direction de l'énergie
href: 'https://www.vd.ch/djes/dge/dge-diren'
target: '_blank'
metadata-files: # Ne pas supprimer !
- assets/format-options.yml
editor_options:
chunk_output_type: console
---
<!-- Les métadonnées ci-dessus doivent être remplies pour chaque fiche. Lorsqu'un champ n'est disponible, il est possible d'écrire "" ou NULL -->
<!-- Aide au remplissage : `obsindVD::open_aide_remplissage_help()` (lancer la ligne de code dans la console) -->
```{r setup}
#| echo: false
#| warning: false
#| message: false
#| results: asis
# version: 1.2.2 (01.09.2026)
# -----------------------------------------------------------------------------
# Ne rien modifier dans ce bloc de code !
# Ce bloc doit être lancé pour charger les métadonnées dans l'environnement !
# -----------------------------------------------------------------------------
# update_model_setup_code() pour mettre à jour ce bloc avec la version du dernier modèle
# Chargement (ou installation) des librairies disponibles sur CRAN
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, readxl, glue, gt, DT, ggiraph, scales, ggtext)
# Chargement de la librairie obsindVD privée
# Pour l'installation : suivre les instructions dans le BitBucket : https://dsigit.etat-de-vaud.ch/outils/git/projects/DGE/repos/obsind/
# Si l'accès n'est pas autorisé, faire une demande à l'Observatoire des indicateurs
library(obsindVD)
# Par défaut : ouvrir l'aide obsindVD (supprimer cette ligne si superflu)
open_fiche_quarto_help()
# Vérifie, ajoute et insère des valeurs par défaut pour les métadonnées manquantes (en-tête YAML)
complete_metadata_params()
# Extraction + validation des métadonnées (en-tête YAML)
selected_metadata <- return_selected_metadata()
# Ajout de l'identifiant dans les en-têtes du document html
display_identifiant(value = selected_metadata[['Identifiant thématique']])
```
::: {.callout-tip .narrow icon="false" collapse="true"}
# Métadonnées de l'indicateur
```{r}
# --------------------------------------
# Présentation des métadonnées ----
# --------------------------------------
tidyr::tibble(
`Attribut` = names(selected_metadata),
`Valeur` = selected_metadata
) |>
gt_table_ind()
```
:::
```{r}
# Préciser année actuelle afin de prendre les données les plus récentes possibles (les stats seront faites pour jusqu'à 1 année avant)
an <- 2026
mois <- "01" # En principe le mois de janvier (01)
an_max <- an-1
```
```{r}
# ---------------------------------------------------------
# Tableau de synthèse ----
# ---------------------------------------------------------
# Pour de l'aide sur comment remplir ce tableau de synthèse lancer la commande suivante dans la console :
# obsindVD::open_tableau_synthese_help()
# Pour afficher l'aide spécifique à une fonction, ajouter '?' avant l'appel de la fonction :
# ?icon_up()
tableau_synthese <- list(
# Premier indicateur... attention à la structure !
list(
titre_indicateur = "Nombre cumulé de subventions promises pour l'installation d'infrastructures de recharge pour véhicules électriques, Vaud <b>[nbre]</b>", # Par défaut = titre issu de la métadonnée (en-tête du document)
valeur_2025 = 1183,
obj_2030 = "...", # valeur numérique OU icônes de flèches
obj_2040 = NA,
obj_2050 = "...",
tendance_observée = icon_up(type = "trend", text = paste0("2021-", an_max)), # icon_up(), icon_flat(), icon_down()
tendance_évaluée = "..." # icon_meh() # icon_happy(), icon_meh(), icon_sad()
),
# Second indicateur... Répliquer la même structure autant de fois que d'indicateurs à afficher dans le tableau de synthèse
list(
titre_indicateur = "Montant cumulé des subventions promises pour l'installation d'infrastructures de recharge pour véhicules électriques, Vaud <b>[Mio CHF]</b>",
valeur_2025 = 14.5,
obj_2030 = "...", # valeur numérique OU icônes de flèches
obj_2040 = NA, # On peut modifier 'Cible non chiffrée' en modifiant l'argument text = "" par exemple pour ne rien afficher
obj_2050 = "...",
tendance_observée = icon_up(type = "trend", text = paste0("2021-", an_max)), # text obligatoire pour type = 'trend'
tendance_évaluée = "..." # icon_happy(tooltip = "Exemple d'info-bulle personnalisé") # 'tooltip' modifie l'info-bulle par défaut
)
)
# Impression du tableau de synthèse
print_tableau_synthese(tableau_synthese) # Le résultat peut être customisé comme un objet {gt}
```
# Description {#sec-description}
Cet indicateur fournit des informations sur le nombre et les montants des subventions demandées, promises ou payées dans le cadre du Programme Mobilité électrique du Canton. Ces subventions visent à encourager l’installation d’infrastructures de recharge de véhicules électriques, qu'elles soient à usage privé ou public. Il s’agit d’une mesure mise en place par le Canton pour faciliter l’électrification de la mobilité. L’objectif final étant de contribuer à l’amélioration de l’efficacité énergétique et de réduire les émissions de CO<sub>2</sub> de ce secteur.
# Cadre de référence {#sec-cadre-reference}
Les objectifs de réduction de la consommation d’énergie, d’augmentation de la production d’énergies renouvelables et d’amélioration de l’efficacité énergétique sont définis dans la Conception cantonale de l’énergie ([CoCEn 2019](https://www.vd.ch/fileadmin/user_upload/themes/environnement/energie/fichiers_pdf/CoCEn_Pub_complete_20190816.pdf)), dont l’un des cadres est la loi fédérale sur la réduction des émissions de CO<sub>2</sub> ([RS 641.71](https://www.lexfind.ch/fe/fr/tol/26489/versions/261035/fr)).
Tant dans la Conception cantonale de l’énergie que dans le dernier Plan climat vaudois ([OCDC, 2025](https://www.vd.ch/fileadmin/user_upload/themes/environnement/climat/fichiers_pdf/Plan-Climat-2024-web-vf.pdf)), l’électrification du parc automobile est considérée comme un levier important pour réduire les émissions de gaz à effet de serre dans le domaine de la mobilité. Ce levier vient en complément d’autres mesures stratégiques telles que la réduction des besoins de mobilité et le report modal vers les transports publics et la mobilité douce.
# Graphique {#sec-graphique}
```{r}
#__________________________
# Préparation des données
#___________________________
tryCatch(
expr = {
############################
# Données SIRENE
sirene_read <- read_xlsx(glue("P:/DIREN/13 EFFICACITE ENERG/13.03 Section E&M/Mobilité/2. Subventions/2. Subvention bornes de recharge/2. Statistiques/Suivi Etat financier/Données/{an}-{mois}_data_SIRENE_extract.xlsx"),
guess_max = 1e5) |>
janitor::clean_names(case="screaming_snake")
# Créer variables :
# MESURE (MOB01 (Subventions pour bornes privées) et MOB02 (Subventions pour bornes publiques))
# ID
# ANNEE (de la date de la décision de l'octroi (DATE_RECEPTION) => ANNE_PROMESSE)
sirene <- sirene_read |>
separate(PROJET, into = c("MESURE", "ANNEE_TEMP", "ID"), sep = "\\.", remove = FALSE) |>
mutate(ANNEE_PROMESSE = year(DATE_RECEPTION)) |>
mutate(MONTANT_PROMESSE = ARGENT_ALLOUE) |>
filter(ANNEE_PROMESSE < an) |>
select(PROJET, MESURE,MONTANT_PROMESSE, ANNEE_PROMESSE,STATUT_DOSSIER,NIVEAU_C_TOTAL,NIVEAU_D_TOTAL, NBRE_PLACES_TOTAL, NIVEAU_C_INTERIEUR, NIVEAU_C_EXTERIEUR, NIVEAU_D_INTERIEUR, NIVEAU_D_EXTERIEUR)
# Problème des bornes (D) publiques (MOB02) où les installations (C) ne sont pas notées (alors qu'elles le devraient). Donc reprendre valeur de D si C < D
sirene <- sirene |>
mutate(NIVEAU_C_TOTAL = case_when(MESURE == "MOB02" & (NIVEAU_C_TOTAL < NIVEAU_D_TOTAL) ~ NIVEAU_D_TOTAL,
TRUE ~ NIVEAU_C_TOTAL),
NIVEAU_C_INTERIEUR = case_when(MESURE == "MOB02" & (NIVEAU_C_INTERIEUR < NIVEAU_D_INTERIEUR) ~ NIVEAU_D_INTERIEUR,
TRUE ~ NIVEAU_C_INTERIEUR),
NIVEAU_C_EXTERIEUR = case_when(MESURE == "MOB02" & (NIVEAU_C_EXTERIEUR < NIVEAU_D_EXTERIEUR) ~ NIVEAU_D_EXTERIEUR,
TRUE ~ NIVEAU_C_EXTERIEUR))
#################################
# Données SAP - Peiements
sap_read <- read_xlsx(glue("P:/DIREN/13 EFFICACITE ENERG/13.03 Section E&M/Mobilité/2. Subventions/2. Subvention bornes de recharge/2. Statistiques/Suivi Etat financier/Données/{an}-{mois}_data_SAP_paiements.xlsx"),
guess_max = 1e5) |>
janitor::clean_names(case="screaming_snake")
sap <- sap_read |>
# supprimer lignes de sous-totaux (à vérifier s'il faut encore le faire)
filter(!is.na(AFFECTATION)) |>
# Créer variables ANNEE MOIS JOUR (du paiement)
separate(DATE_DE_LA_PIECE, into = c("ANNEE","MOIS", "JOUR"), sep = "\\-", remove = FALSE) |>
mutate(ANNEE_PAIEMENT = as.numeric(ANNEE)) |>
separate(TEXTE, into = c("PROJET","DEMANDEUR"), sep = "\\ - ", remove = FALSE) |>
# mutate(MONTANT_PAIEMENT = MONTANT_DEVISE_DOCUMENT) |>
filter(ANNEE_PAIEMENT < an) |>
# sommer les montants par PROJET (dans certains cas, le paiement a été effectué en plusieurs versements)
group_by(PROJET) |>
mutate(MONTANT_PAIEMENT = sum(MONTANT_DEVISE_DOCUMENT)) |>
distinct(PROJET, .keep_all = TRUE) |>
select(PROJET, ANNEE_PAIEMENT, MONTANT_PAIEMENT)
#########################
# Appareiement SIRENE - SAP
sub_mov <- sirene |>
left_join(sap, by = c("PROJET"))
#######################################################
# Création des tableaux de données
#######################################################
# Demandes (on garde toutes les lignes)
demandes_total <- sub_mov |>
group_by(ANNEE_PROMESSE, MESURE) |>
summarise(NOMBRE = n()) |>
pivot_wider(names_from = MESURE, values_from = NOMBRE) |>
mutate(TYPE = "Demandes_Nombre")
# Promesses (on retire les SATUT_DOSSIER "Abandonné" et "Refusé")
promesses <- sub_mov |>
# Supprimer les lignes où Statut dossier" est "Abandonné" ou "Refusé"
filter(!STATUT_DOSSIER %in% c("Abandonné", "Refusé") )
promesses_nombre <- promesses|>
group_by(ANNEE_PROMESSE, MESURE) |>
summarise(NOMBRE = n()) |>
pivot_wider(names_from = MESURE, values_from = NOMBRE) |>
mutate(TYPE = "Promesses_Nombre")
promesses_montants <- promesses |>
group_by(ANNEE_PROMESSE, MESURE) |>
summarise(MONTANT = sum(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MONTANT) |>
mutate(TYPE= "Promesses_Montant_total")
promesses_mean <- promesses |>
group_by(ANNEE_PROMESSE, MESURE) |>
summarise(MOYENNE = mean(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MOYENNE) |>
mutate(TYPE= "Promesses_Montant_Moyenne")
promesses_median <- promesses |>
group_by(ANNEE_PROMESSE, MESURE) |>
summarise(MEDIANE = median(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MEDIANE) |>
mutate(TYPE= "Promesses_Montant_Mediane")
promesses_total <- promesses_nombre |> bind_rows(promesses_montants, promesses_mean, promesses_median)
# Paiements
paiements <- sub_mov |>
# Ne garder que les lignes où il y a une année de paiement
filter(!is.na(ANNEE_PAIEMENT) )
paiements_nombre <- paiements|>
group_by(ANNEE_PAIEMENT, MESURE) |>
summarise(NOMBRE = n()) |>
pivot_wider(names_from = MESURE, values_from = NOMBRE) |>
mutate(TYPE = "Paiements_Nombre")
paiements_montants <- paiements |>
group_by(ANNEE_PAIEMENT, MESURE) |>
summarise(MONTANT = sum(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MONTANT) |>
mutate(TYPE= "Paiements_Montant_total")
paiements_mean <- paiements |>
group_by(ANNEE_PAIEMENT, MESURE) |>
summarise(MOYENNE = mean(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MOYENNE) |>
mutate(TYPE= "Paiements_Montant_Moyenne")
paiements_median <- paiements |>
group_by(ANNEE_PAIEMENT, MESURE) |>
summarise(MEDIANE = median(MONTANT_PROMESSE, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = MEDIANE) |>
mutate(TYPE= "Paiements_Montant_Mediane")
paiements_total <- paiements_nombre |> bind_rows(paiements_montants, paiements_mean, paiements_median)
# Places, installations techniques, bornes
places_paiements <- sub_mov |>
# Ne garder que les lignes où il y a une année de paiement
filter(!is.na(ANNEE_PAIEMENT) ) |>
group_by(MESURE) |>
summarise(C_TOTAL = sum(NIVEAU_C_TOTAL, na.rm = TRUE),
D_TOTAL = sum(NIVEAU_D_TOTAL, na.rm = TRUE),
PLACES_TOT = sum(NBRE_PLACES_TOTAL, na.rm = TRUE),
C_INTERIEUR = sum(NIVEAU_C_INTERIEUR, na.rm = TRUE),
C_EXTERIEUR = sum(NIVEAU_C_EXTERIEUR, na.rm = TRUE),
D_INTERIEUR = sum(NIVEAU_D_INTERIEUR, na.rm = TRUE) ,
D_EXTERIEUR = sum(NIVEAU_D_EXTERIEUR, na.rm = TRUE)) |>
mutate(TYPE= "Places_paiements")
places_promesses <- sub_mov |>
# Supprimer les lignes où Statut dossier" est "Abandonné" ou "Refusé"
filter(!STATUT_DOSSIER %in% c("Abandonné", "Refusé") ) |>
group_by(MESURE) |>
summarise(C_TOTAL = sum(NIVEAU_C_TOTAL, na.rm = TRUE),
D_TOTAL = sum(NIVEAU_D_TOTAL, na.rm = TRUE),
PLACES_TOT = sum(NBRE_PLACES_TOTAL, na.rm = TRUE),
C_INTERIEUR = sum(NIVEAU_C_INTERIEUR, na.rm = TRUE),
C_EXTERIEUR = sum(NIVEAU_C_EXTERIEUR, na.rm = TRUE),
D_INTERIEUR = sum(NIVEAU_D_INTERIEUR, na.rm = TRUE) ,
D_EXTERIEUR = sum(NIVEAU_D_EXTERIEUR, na.rm = TRUE)) |>
mutate(TYPE= "Places_promesses")
places <- places_promesses |> bind_rows(places_paiements)
# Places promises - évolution
places_promises_c <- sub_mov |>
# Supprimer les lignes où Statut dossier" est "Abandonné" ou "Refusé"
filter(!STATUT_DOSSIER %in% c("Abandonné", "Refusé") ) |>
group_by(MESURE, ANNEE_PROMESSE) |>
summarise(C_TOTAL = sum(NIVEAU_C_TOTAL, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = C_TOTAL) |>
mutate(TYPE= "Places_promesses_Installations")
places_promises_d <- sub_mov |>
# Supprimer les lignes où Statut dossier" est "Abandonné" ou "Refusé"
filter(!STATUT_DOSSIER %in% c("Abandonné", "Refusé") ) |>
group_by(MESURE, ANNEE_PROMESSE) |>
summarise(D_TOTAL = sum(NIVEAU_D_TOTAL, na.rm = TRUE)) |>
pivot_wider(names_from = MESURE, values_from = D_TOTAL) |>
mutate(TYPE= "Places_promesses_Bornes")
places_promises_evolution <- places_promises_c |>
bind_rows(places_promises_d)
# Montants des subventions PAYEES selon les années de BUDGET
# Montants des subventions
payes_par_promesses <- sub_mov |>
# Ne garder que les lignes où il y a une année de paiement
filter(!is.na(ANNEE_PAIEMENT) ) |>
group_by(ANNEE_PAIEMENT, ANNEE_PROMESSE) |>
summarise(MONTANT = sum(MONTANT_PAIEMENT, na.rm = T)) |>
arrange(ANNEE_PROMESSE) |>
pivot_wider(names_from = ANNEE_PROMESSE, values_from = MONTANT)|>
mutate(TYPE = "ANNEE_PROMESSE")
###################################
# EXPORT des données
###################################
list_objets <- list("demandes_total" = demandes_total, "promesses_total" = promesses_total, "paiements_total" = paiements_total, "places" = places, "payes_par_promesses" = payes_par_promesses, "places_promises_evolution" = places_promises_evolution)
# Export du file dans dossier data
writexl::write_xlsx(list_objets, glue("./data/./Subventions_Mobilite_Bornes.xlsx"))
},
error = function(e) stop("Download failed: Il faut vérifier que le doc des subventions mobilité n'a pas changé", e$message),
warning = function(w) {message("Download failed: Il faut vérifier que le doc des subventions mobilité n'a pas changé", w$message)}
)
# subventions_mobilite_bornes <- read_xlsx("./data/Subventions_Mobilite_Bornes.xlsx")
file_path <- "./data/Subventions_Mobilite_Bornes.xlsx"
# récupérer les noms des feuilles
sheets <- excel_sheets(file_path)
# lire chaque feuille -> liste de dataframes
stat_mob <- map(
setNames(sheets, sheets),
~ read_xlsx(file_path, sheet = .x)
)
```
```{r }
#| label: fig-G1
##| fig-cap: "- Montants des subventions payées pour l'infrastructure de recharge de véhicules électriques à usage privé et public, selon l'année de la promesse de subvention, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
# Montants des subventions
payes_par_budget <- stat_mob$payes_par_promesses |>
select(-TYPE)
data_long <- payes_par_budget |>
pivot_longer(
cols = -1, # toutes les colonnes sauf la 1ère
names_to = "ANNEE_PROMESSE",
values_to = "MONTANTS"
) |>
mutate(ANNEE_PROMESSE = factor(ANNEE_PROMESSE,
levels = sort(unique(ANNEE_PROMESSE), decreasing = TRUE)
)) |>
mutate(MONTANTS = MONTANTS / 1e6)
montants_total <- data_long |>
group_by(ANNEE_PAIEMENT) |>
summarise(TOTAL = sum(MONTANTS, na.rm = TRUE), .groups = "drop")
g1_plot <- ggplot() +
# Bars (objectives and consumption)
geom_col_interactive(
data = data_long,
aes(x = ANNEE_PAIEMENT, y = MONTANTS, fill = ANNEE_PROMESSE,
tooltip = paste("Montants promis en ", ANNEE_PROMESSE, " et payés en ", ANNEE_PAIEMENT, " : ", label_number(accuracy = 0.1, big.mark = "'")(MONTANTS), " Mio CHF"),
data_id = paste(ANNEE_PAIEMENT, ANNEE_PROMESSE)),
width = 0.7
) +
# ajout valeur du total sur l'histogramme
geom_text(
data = montants_total,
inherit.aes = FALSE,
aes(
x = ANNEE_PAIEMENT,
y = TOTAL + 0.3,
label = scales::label_number(accuracy = 0.1, big.mark = "'")(TOTAL)
)
,
# hjust = 0.5, # décale à gauche
# vjust = -0.8, # décalé vers le haut
size = 3.5,
# color= "#00EE76",
fontface = "bold"
)+
scale_y_continuous(expand = expansion(mult = c(0, 0.1)))+
# scale_fill_viridis_d(direction = -1, name = NULL)+
# Titles and caption
labs(
title = str_wrap("**Montants payés annuellemnt pour des infrastructures de recharge de véhicules électriques à usage privé et public**", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
subtitle = str_wrap("Selon l'année de la promesse de subvention, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
x = NULL,
y= "Montants en Mio CHF",
fill = "Année de l'octroi",
color = NULL,
caption = "Source: DGE-DIREN<br>Etat au 31.12.2025"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_markdown(face = "bold", size = 12),
plot.subtitle = element_markdown(size = 10),
plot.caption = element_markdown(hjust = 0, size = 9, margin = margin(t = 5), face = "italic"), # rajout italic
plot.caption.position = "plot",
plot.margin = margin(10, 10, 30, 10),
legend.position = "right", # "top" "left" "right" "none"
legend.box = "vertical", #"horizontal"
legend.box.just = "left", # aligne les blocs à gauche
legend.justification = "left",
legend.text = element_markdown(size = 10),
legend.title = element_markdown(size = 12),
legend.spacing.y = unit(0.1, "cm"), # espace entre blocs
legend.margin = margin(t = 0, b = 0), # supprime marge globale
legend.box.spacing = unit(0.1, "cm"), # espace bloc-légende vs reste du plot
axis.text = element_text(size = 8),
axis.title = element_markdown(size = 10)
)
obsindVD::girafe_light(g1_plot,
# Ajout de la transparence aux éléments non-survolés !
options = list(
opts_hover_inv(css = "opacity:0.5;"),
opts_hover(css = "opacity:1;"),
# Ajout du nom du PNG téléchargé + remplacement de 'download' par 'télécharger' (survol icône)
opts_toolbar(
position = "topright",
hidden = c("zoom", "selection"),
pngname = paste0(selected_metadata[['Identifiant thématique']], "_G1"),
tooltips = list(
saveaspng = "Télécharger"
)
)
)
)
ggsave(glue("./images/g1_Montants_payés_par_ANNEE_PAIEMENT_et_PROMESSE_2021-{an-1}.png"), width = 8, height = 6, dpi = 300)
```
```{r}
#| label: fig-G2
##| fig-cap: "Infrastructures de recharge de véhicules électriques à usage privé et public, subventions promises annuelles et cumulées, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
######################################################
# A REVOIR COMPLETEMENT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
infrastructures_temp <- stat_mob$places_promises_evolution |>
mutate(ANNEE = as.integer(as.character(ANNEE_PROMESSE)),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
select(ANNEE, TOTAL, TYPE)
# Créer la différenciation entre Bornes et Equpement électrique exclusivement (EQUIPEMENT)
infrastructures <- infrastructures_temp |>
pivot_wider(
names_from = TYPE,
values_from = TOTAL
) |>
mutate(
BORNES = Places_promesses_Bornes,
EQUIPEMENTS = Places_promesses_Installations - Places_promesses_Bornes,
TOTAL = Places_promesses_Installations,
TOTAL_CUMULE = cumsum(TOTAL),
BORNES_CUMULE = cumsum(BORNES),
EQUIPEMENTS_CUMULE = cumsum(EQUIPEMENTS)
) |>
select(-c(Places_promesses_Installations, Places_promesses_Bornes))
infrastructures_long <- infrastructures |>
select(ANNEE, BORNES, EQUIPEMENTS) |>
pivot_longer(
cols = -ANNEE,
names_to = "TYPE",
values_to = "NOMBRE"
) |>
mutate(
TYPE = factor(TYPE, levels = c("BORNES", "EQUIPEMENTS")),
TYPE_LABEL = recode(
TYPE,
"BORNES" = "Equipement électrique avec borne de recharge",
"EQUIPEMENTS" = "Equipement électrique exclusivement")
)
infrastructures_total <- infrastructures |>
select(ANNEE, TOTAL) |>
rename(NOMBRE = TOTAL)
infrastructures_cumule <- infrastructures |>
select(ANNEE, EQUIPEMENTS_CUMULE, BORNES_CUMULE) |>
pivot_longer(
cols = -ANNEE,
names_to = "TYPE",
values_to = "NOMBRE"
) |>
mutate(TYPE_LABEL = recode(
TYPE,
"BORNES_CUMULE" = "Equipement électrique avec borne de recharge",
"EQUIPEMENTS_CUMULE" = "Equipement électrique exclusivement")
)
# Valeurs des derniers TOTAL_CUMULE (pour que les valeurs des totaux cumulés apparaissent dans le graphique)
last_cumul <- infrastructures_cumule|>
group_by(TYPE) |>
filter(ANNEE == an-1) |>
ungroup()
# Coefficient
coef <- min(infrastructures_total$NOMBRE, na.rm = TRUE) /
(0.35*max(infrastructures_cumule$NOMBRE, na.rm = TRUE))
g2_plot <- ggplot() +
# Bars
geom_col_interactive(
data = infrastructures_long,
aes(x = ANNEE, y = NOMBRE, fill = factor(TYPE, levels = c("BORNES", "EQUIPEMENTS")), group = TYPE,
tooltip = paste(TYPE_LABEL, " ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(NOMBRE)),
data_id = paste(ANNEE, TYPE, "annuel")),
width = 0.7,
position = position_stack(reverse= TRUE),
color = NA
) +
# Ajout du total sur les stack
geom_text(
data = infrastructures_total,
inherit.aes = FALSE,
aes(
x = ANNEE,
y = NOMBRE,
label = label_number(accuracy = 1, big.mark = "'")(NOMBRE)
),
vjust = -0.5,
size = 3
) +
# Ajout du total cumulé pour la dernière année
geom_text(
data = last_cumul,
aes(
x = ANNEE,
y = NOMBRE * coef,
label = scales::label_number(big.mark = "'")(NOMBRE),
color = TYPE,
group = TYPE
),
hjust = 0.5, # décale à gauche
vjust = -0.8, # décalé vers le haut
size = 3.5,
show.legend = FALSE
# fontface = "bold"
)+
# lignes pour TOTAL_CUMULE
geom_line_interactive(
data = infrastructures_cumule,
aes(
x = ANNEE,
y = NOMBRE * coef,
color = TYPE,
group = TYPE
),
linewidth = 1.1
) +
geom_point_interactive(
data = infrastructures_cumule,
aes(
x = ANNEE,
y = NOMBRE * coef,
color = TYPE,
tooltip = paste(
"Nombre cumulé de ",
TYPE, " ",
ANNEE, " : ",
scales::label_number(big.mark = "'")(NOMBRE)
)
,
data_id = paste(ANNEE, NOMBRE, "cumul_pt")
),
size = 2
)+
# Colors
scale_fill_manual(
values = c(
"BORNES" = "#EEE5B2",
"EQUIPEMENTS" = "#B7C9B3"
),
labels = c(
"BORNES" = "Equipement électrique avec borne de recharge",
"EQUIPEMENTS" = "Equipement électrique exclusivement")
) +
scale_color_manual(
values = c(
"BORNES_CUMULE" = "#9A823E",
"EQUIPEMENTS_CUMULE" = "#6F8F72"),
labels = c(
"BORNES_CUMULE" = "Equipement électrique avec borne de recharge",
"EQUIPEMENTS_CUMULE" = "Equipement électrique exclusivement")
) +
# Titles and caption
scale_y_continuous(
labels = scales::label_number(big.mark = "'"),
name = "Nombre d'infrastructures annuelles",
sec.axis = sec_axis(~ . / coef, name = "Nombre cumulé d'infrastructures",
labels = scales::label_number(big.mark = "'")),
expand = expansion(mult = c(0, 0.1))
) +
# scale_x_discrete()+
scale_x_continuous(breaks = sort(unique(infrastructures_total$ANNEE)))+
labs(
title = str_wrap("**Infrastructures de recharge de véhicules électriques à usage privé et public avec promesse d'une subvention**", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
subtitle = str_wrap("Nombres annuels et cumulés d'infrastructures subventionnées, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
x = NULL,
y= "Nombre d'infrastructures annuelles",
fill = NULL,
color = NULL,
caption = "Source: DGE-DIREN<br>Etat au 31.12.2025"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_markdown(face = "bold", size = 12),
plot.subtitle = element_markdown(size = 10),
plot.caption = element_markdown(hjust = 0, size = 9, margin = margin(t = 5), face = "italic"), # rajout italic
plot.caption.position = "plot",
plot.margin = margin(10, 10, 30, 10),
legend.position = "bottom", # "top" "left" "right" "none"
legend.box = "vertical", #"horizontal"
legend.box.just = "left", # aligne les blocs à gauche
legend.justification = "left",
legend.text = element_markdown(size = 10),
legend.title = element_markdown(size = 12),
legend.spacing.y = unit(0.1, "cm"), # espace entre blocs
legend.margin = margin(t = 0, b = 0), # supprime marge globale
legend.box.spacing = unit(0.1, "cm"), # espace bloc-légende vs reste du plot
axis.text = element_text(size = 8),
axis.title = element_markdown(size = 10)
)
obsindVD::girafe_light(g2_plot,
# Ajout de la transparence aux éléments non-survolés !
options = list(
opts_hover_inv(css = "opacity:0.5;"),
opts_hover(css = "opacity:1;"),
# Ajout du nom du PNG téléchargé + remplacement de 'download' par 'télécharger' (survol icône)
opts_toolbar(
position = "topright",
hidden = c("zoom", "selection"),
pngname = paste0(selected_metadata[['Identifiant thématique']], "_G2"),
tooltips = list(
saveaspng = "Télécharger"
)
)
)
)
ggsave(glue("./images/g2_Infrastructures_mobilite_subventionnees_2021-{an-1}.png"), width = 8, height = 6, dpi = 300)
```
```{r}
#| label: fig-G3
##| fig-cap: "Montants des subventions promises et payées pour l'infrastructure de recharge de véhicules électriques à usage privé et public, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
# Montant des promesses
montant_promesses <- stat_mob$promesses_total |>
filter(TYPE == "Promesses_Montant_total") |>
mutate(ANNEE_PROMESSE = as.integer(as.character(ANNEE_PROMESSE)),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
arrange(ANNEE_PROMESSE) |>
mutate(TOTAL_CUMULE = cumsum(TOTAL) ,
ANNEE = ANNEE_PROMESSE) |>
select(ANNEE, TYPE, TOTAL, TOTAL_CUMULE)
# Montant des paiement
montant_paiements <- stat_mob$paiements_total |>
filter(TYPE == "Paiements_Montant_total") |>
mutate(ANNEE_PAIEMENT = as.integer(as.character(ANNEE_PAIEMENT)),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
arrange(ANNEE_PAIEMENT) |>
mutate(TOTAL_CUMULE = cumsum(TOTAL) ,
ANNEE = ANNEE_PAIEMENT) |>
select(ANNEE, TYPE, TOTAL, TOTAL_CUMULE)
####################################
# Préparer données TOTAL
# Montant PROMESSES
montant_promesses_total <- montant_promesses |>
mutate(TYPE = "Promesses") |>
select(ANNEE, TYPE, TOTAL)
# Montant PAIEMENTS
montant_paiements_total <- montant_paiements |>
mutate(TYPE = "Paiements") |>
select(ANNEE, TYPE, TOTAL)
# Combiner PROMESSES et PAIEMENTS
montants_total <- montant_promesses_total |>
bind_rows(montant_paiements_total) |>
mutate(TYPE_LABEL = recode(
TYPE,
"Promesses" = "Montants des subventions promises",
"Paiements" = "Montants des subventions payées")
)
####################################
# Préparer données TOTAL_CUMULE
# Montant PROMESSES
montant_promesses_cumule <- montant_promesses |>
mutate(TYPE = "Promesses") |>
select(ANNEE, TYPE, TOTAL_CUMULE)
# Montant PAIEMENTS
montant_paiements_cumule <- montant_paiements |>
mutate(TYPE = "Paiements") |>
select(ANNEE, TYPE, TOTAL_CUMULE)
# Combiner PROMESSES et PAIEMENTS
montants_total_cumule <- montant_promesses_cumule |>
bind_rows(montant_paiements_cumule) |>
mutate(TYPE_LABEL = recode(
TYPE,
"Promesses" = "Montants cumulés des subventions promises",
"Paiements" = "Montants cumulés des subventions payées")
)
# Valeurs des derniers TOTAL_CUMULE (pour que les valeurs des totaux cumulés apparaissent dans le graphique)
last_cumul <- montants_total_cumule|>
group_by(TYPE) |>
filter(ANNEE == an-1) |>
ungroup()
# # valeur du dernier NOMBRE_CUMULE (pour que ça apparaisse dans le graphique)
# last_cumul_paiements <- montant_paiements|>
# filter(ANNEE == an-1) |>
# select(ANNEE, TOTAL_CUMULE)
# Coefficient
coef <- min(montants_total$TOTAL, na.rm = TRUE) /
(0.02*max(montants_total_cumule$TOTAL_CUMULE, na.rm = TRUE))
g3_plot <- ggplot() +
# Bars
geom_col_interactive(
data = montants_total,
aes(x = ANNEE, y = TOTAL, fill = TYPE, group = TYPE,
tooltip = paste(TYPE_LABEL, " en ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(TOTAL), " CHF"),
data_id = paste(ANNEE, TYPE, "annuel")),
width = 0.7,
position = "dodge",
color = NA
) +
geom_text(
data = last_cumul,
aes(
x = ANNEE,
y = TOTAL_CUMULE * coef,
label = scales::label_number(big.mark = "'")(TOTAL_CUMULE),
color = TYPE,
group = TYPE
),
hjust = 0.5, # décale à gauche
vjust = -0.8, # décalé vers le haut
size = 3.5,
show.legend = FALSE
# fontface = "bold"
)+
# lignes pour TOTAL_CUMULE
geom_line_interactive(
data = montants_total_cumule,
aes(
x = ANNEE,
y = TOTAL_CUMULE * coef,
color = TYPE,
group = TYPE
),
linewidth = 1.1
) +
geom_point_interactive(
data = montants_total_cumule,
aes(
x = ANNEE,
y = TOTAL_CUMULE * coef,
color = TYPE,
tooltip = paste(
"Total cumulé des montants ",
TYPE, " ",
ANNEE, " : ",
scales::label_number(big.mark = "'")(TOTAL_CUMULE), " CHF"
)
,
data_id = paste(ANNEE, TOTAL_CUMULE, "cumul_pt")
),
size = 2
)+
# Colors
scale_fill_manual(
values = c(
"Promesses" = "#B7C9B3",
"Paiements" = "#EEE5B2"
),
labels = c(
"Promesses" = "Montants des subventions promises",
"Paiements" = "Montants des subventions payées"
)
) +
scale_color_manual(
values = c(
"Promesses" = "#6F8F72",
"Paiements" = "#D6C07A"
),
labels = c(
"Promesses" = "Cumul des montants promis",
"Paiements" = "Cumul des montants payés"
)
) +
# Titles and caption
scale_y_continuous(
labels = scales::label_number(big.mark = "'"),
name = "Montants annuels en CHF",
sec.axis = sec_axis(~ . / coef, name = "Montants cumulés en CHF",
labels = scales::label_number(big.mark = "'")),
expand = expansion(mult = c(0, 0.1))
) +
# scale_x_discrete()+
scale_x_continuous(breaks = sort(unique(montants_total$ANNEE)))+
labs(
title = str_wrap("**Montant des subventions pour des infrastructures de recharge de véhicules électriques à usage privé et public**", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
subtitle = str_wrap("Montants annuels et cumulés des subventions promises et payées, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
x = NULL,
y= "Montant des subventions en CHF",
fill = NULL,
color = NULL,
caption = "Source: DGE-DIREN<br>Etat au 31.12.2025"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_markdown(face = "bold", size = 12),
plot.subtitle = element_markdown(size = 10),
plot.caption = element_markdown(hjust = 0, size = 9, margin = margin(t = 5), face = "italic"), # rajout italic
plot.caption.position = "plot",
plot.margin = margin(10, 10, 30, 10),
legend.position = "bottom", # "top" "left" "right" "none"
legend.box = "vertical", #"horizontal"
legend.box.just = "left", # aligne les blocs à gauche
legend.justification = "left",
legend.text = element_markdown(size = 10),
legend.title = element_markdown(size = 12),
legend.spacing.y = unit(0.1, "cm"), # espace entre blocs
legend.margin = margin(t = 0, b = 0), # supprime marge globale
legend.box.spacing = unit(0.1, "cm"), # espace bloc-légende vs reste du plot
axis.text = element_text(size = 8),
axis.title = element_markdown(size = 10)
)
obsindVD::girafe_light(g3_plot,
# Ajout de la transparence aux éléments non-survolés !
options = list(
opts_hover_inv(css = "opacity:0.5;"),
opts_hover(css = "opacity:1;"),
# Ajout du nom du PNG téléchargé + remplacement de 'download' par 'télécharger' (survol icône)
opts_toolbar(
position = "topright",
hidden = c("zoom", "selection"),
pngname = paste0(selected_metadata[['Identifiant thématique']], "_G3"),
tooltips = list(
saveaspng = "Télécharger"
)
)
)
)
ggsave(glue("./images/g3_Montants_subventions_infrastructures_mobilite_2021-{an-1}.png"), width = 8, height = 6, dpi = 300)
```
```{r}
#| label: fig-G4
#| include: false # afin que le graphique n'apparaisse pas dans le render
##| fig-cap: "Subventions promises pour des infrastructures de recharge de véhicules électriques à usage privé et public, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
promesses <- stat_mob$promesses_total |>
filter(TYPE == "Promesses_Nombre") |>
mutate(ANNEE_PROMESSE = as.integer(as.character(ANNEE_PROMESSE)),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
arrange(ANNEE_PROMESSE) |>
mutate(TOTAL_CUMULE = cumsum(TOTAL),
MOB01_CUMULE = cumsum(MOB01),
MOB02_CUMULE = cumsum(MOB01)) |>
mutate(ANNEE = as.factor(ANNEE_PROMESSE)) |>
select(ANNEE, MOB01, MOB02, TOTAL, MOB01_CUMULE, MOB02_CUMULE, TOTAL_CUMULE)
# valeur du dernier NOMBRE_CUMULE (pour que ça apparaisse dans le graphique)
last_cumul <- promesses|>
filter(ANNEE == an-1) |>
select(ANNEE, TOTAL_CUMULE)
# faire un pivot_longer pour le graphique
promesses_long <- promesses |>
select(ANNEE, MOB01, MOB02) |>
pivot_longer(
cols = -1, # toutes les colonnes sauf la 1ère (celle de l'année)
names_to = "MESURE",
values_to = "NOMBRE"
) |>
mutate(MESURE_LABEL = recode(
MESURE,
"MOB01" = "Usage privé",
"MOB02" = "Usage public")
)
promesses_total <- promesses |>
rename(NOMBRE = TOTAL) |>
select(ANNEE, NOMBRE)
promesses_cumule <- promesses |>
rename(NOMBRE = TOTAL_CUMULE) |>
select(ANNEE, NOMBRE)
# Coefficient
coef <- min(promesses_long$NOMBRE, na.rm = TRUE) /
(0.02*max(promesses_cumule$NOMBRE, na.rm = TRUE))
g4_plot <- ggplot() +
# Bars
geom_col_interactive(
data = promesses_long,
aes(x = ANNEE, y = NOMBRE, fill = MESURE, group = MESURE,
tooltip = paste(MESURE_LABEL, " ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(NOMBRE)),
data_id = paste(ANNEE, MESURE, "annuel")),
width = 0.7,
position = "stack",
color = NA
) +
# Ajout du total sur les stack
geom_text(
data = promesses_total,
inherit.aes = FALSE,
aes(
x = ANNEE,
y = NOMBRE,
label = label_number(accuracy = 1, big.mark = "'")(NOMBRE)
),
vjust = -0.5,
size = 3
) +
# Ajout du total cumulé pour la dernière année
geom_text(
data = last_cumul,
aes(
x = ANNEE,
y = TOTAL_CUMULE * coef,
label = scales::label_number(big.mark = "'")(TOTAL_CUMULE)
),
hjust = 0.5, # décale à gauche
vjust = -0.8, # décalé vers le haut
size = 3.5,
color= "red"
# fontface = "bold"
)+
# lignes pour TOTAL_CUMULE
geom_line_interactive(
data = promesses_cumule,
aes(
x = ANNEE,
y = NOMBRE * coef,
color = "Cumul",
group = 1
),
linewidth = 1.1
) +
geom_point_interactive(
data = promesses_cumule,
aes(
x = ANNEE,
y = NOMBRE * coef,
color = "Cumul",
tooltip = paste(
"Nombre cumulé de subventions promises pour des infrastructures de recharge jusqu'en ",
ANNEE, ":",
scales::label_number(big.mark = "'")(NOMBRE)
)
,
data_id = paste(ANNEE, NOMBRE, "cumul_pt")
),
size = 2
)+
# Colors
scale_fill_manual(
values = c(
"MOB01" = "#1b9e77",
"MOB02" = "#a6dba0"
),
labels = c(
"MOB01" = "Usage privé",
"MOB02" = "Usage public"
)
) +
scale_color_manual(
values = c("Cumul" = "red"),
labels = c("Cumul" = "Nombre cumulé\nde subventions")
)+
# Titles and caption
scale_y_continuous(
name = "Nombre de subventions annuelles",
sec.axis = sec_axis(~ . / coef, name = "Nombre cumulé de subventions"),
expand = expansion(mult = c(0, 0.1))
) +
scale_x_discrete()+
# scale_x_continuous(breaks = sort(unique(promesses$ANNEE)))+
labs(
title = str_wrap("**Subventions promises pour des infrastructures de recharge de véhicules électriques à usage privé et public**", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
subtitle = str_wrap("Nombres annuels et cumulés de subventions, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
x = NULL,
y= "Nombre d'infrastructures annuelles",
fill = NULL,
color = NULL,
caption = "Source: DGE-DIREN<br>Etat au 31.12.2025"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_markdown(face = "bold", size = 12),
plot.subtitle = element_markdown(size = 10),
plot.caption = element_markdown(hjust = 0, size = 9, margin = margin(t = 5), face = "italic"), # rajout italic
plot.caption.position = "plot",
plot.margin = margin(10, 10, 30, 10),
legend.position = "bottom", # "top" "left" "right" "none"
legend.box = "vertical", #"horizontal"
legend.box.just = "left", # aligne les blocs à gauche
legend.justification = "left",
legend.text = element_markdown(size = 10),
legend.title = element_markdown(size = 12),
legend.spacing.y = unit(0.1, "cm"), # espace entre blocs
legend.margin = margin(t = 0, b = 0), # supprime marge globale
legend.box.spacing = unit(0.1, "cm"), # espace bloc-légende vs reste du plot
axis.text = element_text(size = 8),
axis.title = element_markdown(size = 10)
)
obsindVD::girafe_light(g4_plot,
# Ajout de la transparence aux éléments non-survolés !
options = list(
opts_hover_inv(css = "opacity:0.5;"),
opts_hover(css = "opacity:1;"),
# Ajout du nom du PNG téléchargé + remplacement de 'download' par 'télécharger' (survol icône)
opts_toolbar(
position = "topright",
hidden = c("zoom", "selection"),
pngname = paste0(selected_metadata[['Identifiant thématique']], "_G4"),
tooltips = list(
saveaspng = "Télécharger"
)
)
)
)
ggsave(glue("./images/g4_Subventions_Promesses_Infrastructures-Mobilite_2021-{an-1}.png"), width = 8, height = 6, dpi = 300)
```
# Analyse {#sec-analyse}
<!-- Aide au remplissage : consulter la section correspondante avec `obsindVD::open_aide_remplissage_help()` -->
## Description statistique {#sec-analyse-description}
Un total de 1’183 subventions ont été promises pour l’installation d’infrastructures de recharge pour les véhicules électriques depuis le lancement du programme en 2021 (@tbl-T1).
Les subventions promises sont payées dans la majorité des cas entre 12 et 24 mois après le dépôt de la demande (@fig-G1). Ces subventions concernent surtout des infrastructures de recharge à usage privé (@tbl-T1). Le nombre de demandes de subventions annuelles du programme Mobilité électrique du Canton de Vaud est passé de 198 en 2021 à 221 en 2025, avec un pic à plus de 400 en 2023.
Le nombre total d’équipements pour lesquels une subvention avait été promise se montait à près de 25'000 à fin 2025, dont plus de trois quarts concernaient uniquement l’installation d’équipements électriques, sans bornes de recharge (@fig-G2). Les montants totaux promis à travers ces subventions étaient de plus de 14 millions à fin 2025, dont près de 10 millions avaient déjà été payés au 31.12.2025 (@fig-G3).
## Interprétation {#sec-analyse-interpretation}
Le secteur des transports est responsable aujourd’hui de plus de 30% des émissions territoriales de CO2 dans le canton de Vaud. Le transport individuel motorisé (TIM) représente environ trois quarts de la consommation d’énergie de ce secteur. Les politiques publiques visent en priorité la réduction des kilomètres parcourus et le transfert modal du TIM vers les transports publics et la mobilité douce. En complément, les stratégies cantonales telles que le Plan climat vaudois promeuvent également l’électromobilité pour sortir le TIM de sa dépendance aux énergies fossiles.
L’Office fédéral de l’énergie incite à promouvoir la recharge à domicile et à favoriser l’installation de bornes de recharge, que ce soit dans l’espace public ou dans les immeubles d’habitation (OFEN, 2023), par exemple par le biais de subventions. Les résultats présentés dans cette fiche montrent que la politique publique vaudoise en matière de recharge de véhicules électriques a porté ses fruits durant les dernières années.
Par le biais de subventions à l’installation d’infrastructures de recharge pour véhicules électriques, le Canton vise à lever un frein au passage à l’électromobilité en facilitant l’accès de tous les citoyens à une installation de recharge. En ce sens, seuls les entreprises et les habitants d’immeubles de plus de 3 appartements sont éligibles à la subvention pour infrastructure de recharge privée ; les habitants de maison individuelle n’ont en général pas de problèmes pour installer une borne de recharge s’ils le désirent. Afin de limiter un éventuel effet d’aubaine, il a été décidé de diminuer les montants accordés pour l’installation de bornes de recharges en 2023, tandis que les montants promis pour l’équipement électrique des places n’ont presque pas été modifiés. Le pic de demandes de subventions observé en 2023 peut s’expliquer par l’annonce de cette baisse. En effet, de nombreuses demandes ont été adressées à la DGE-DIREN juste avant son entrée en vigueur.
En 2025, une nouvelle baisse des montants de subvention a été décidée, avec notamment la suppression de la subvention pour l’installation de bornes de recharge. Malgré ces deux baisses, en 2023, puis en 2025, le nombre de subventions demandées en 2024 et en 2025 est du même ordre de grandeur que celui de 2022 (@fig-G1). Cela répond à l’objectif de la DIREN d’encourager le pré-équipement d’un maximum de places de parc à usage privé, facilitant ainsi l’installation d’une borne de recharge en cas d’acquisition ultérieure d’un véhicule électrique.
## Périmètre et limites {#sec-analyse-perimetre}
Comme l’illustrent les données de 2023, le nombre de demandes peut significativement varier en fonction d’événements tels que le changement des montants promis pour l’installation de bornes de recharge. Les chiffres annuels sont donc à prendre avec précaution. De plus, les données à disposition de la DIREN ne concernent que les demandes de subventions reçues par le service. Le nombre total d’infrastructures de recharge installées dans le canton (en comptant les installations inéligibles à la subvention, ou celles pour lesquelles les propriétaires auraient décidé de ne pas soumettre une demande de soutien) n’est pas connu précisément.
# Tableaux {#sec-tableaux}
```{r}
#| label: tbl-T1
# #| tbl-cap: "Subventions octroyées pour infrastructures mobilité"
promesses_temp <- stat_mob$promesses_total |>
filter(TYPE == "Promesses_Nombre") |>
mutate(ANNEE = as.character(ANNEE_PROMESSE),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
arrange(ANNEE) |>
# mutate(TOTAL_CUMULE = cumsum(TOTAL),
# MOB01_CUMULE = cumsum(MOB01),
# MOB02_CUMULE = cumsum(MOB01)) |>
# mutate(ANNEE = as.factor(ANNEE_PROMESSE)) |>
# mutate(MESURE_LABEL = recode(
# MESURE,
# "MOB01" = "Usage privé",
# "MOB02" = "Usage public")
# ) |>
select(ANNEE, TOTAL, MOB01, MOB02)
promesses_tot <- promesses_temp |>
summarise(TOTAL = sum(TOTAL, na.rm = TRUE),
MOB01 = sum(MOB01, na.rm = TRUE),
MOB02 = sum(MOB02, na.rm = TRUE)) |>
mutate(ANNEE = "Total") |>
select(ANNEE, TOTAL, MOB01, MOB02)
promesses <- promesses_tot |>
bind_rows(promesses_temp)
########################################################
t1 <- promesses|>
gt() |>
tab_header(title = md("**Subventions promises pour des infrastructures de recharge de véhicules électriques**"),
subtitle = "Usage privé et public, Vaud")|>
cols_width(everything() ~ pct(100 / ncol(promesses))) |>
tab_style(style = cell_text(weight = "bold"),
locations = list(cells_body(rows = ANNEE == "Total"),
cells_column_labels(),
cells_body(columns = "TOTAL"))) |>
tab_style(
style = cell_text(align = "center"),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(align = "left"),
locations = cells_footnotes()
) |>
tab_style(
style = cell_text(align = "left"),
locations = cells_source_notes()
) |>
cols_align(align = "center") |> #, columns = "Année") |>
cols_label(
ANNEE = "Année",
TOTAL = "Total",
MOB01 = "Usage privé",
MOB02 = "Usage public"
) |>
cols_label_with(
columns = -c("ANNEE"),
fn = \(col) md(paste0(col, "\n\n[nbre]"))
) |>
fmt_number(columns = -ANNEE,
sep_mark = "'",
decimals = 0
) |>
tab_footnote(footnote = "Les deux mesures du Programme Mobilité sont MOB 01 (subvention pour l’infrastructure de recharge à usage privé) et MOB 02 (subvention pour l’infrastructure de recharge à usage public).",
locations = cells_title(groups = "title"),
placement = "right") |>
tab_style(style = cell_borders(sides = "all"),
locations = list(cells_column_labels(), cells_column_spanners())) |>
tab_style(style = cell_borders(sides = c("left", "right")),
locations = list(cells_body())) |>
tab_options(column_labels.border.bottom.color = "black") |>
fmt_missing(columns = everything(), missing_text = "") |>
opt_table_outline(style = "solid", width = px(2), color = "lightgrey") |>
tab_source_note(
source_note = md("*Source: DGE-DIREN<br>Etat au 31.12.2025*")
)
t1
gtsave(t1, glue("./images/t1_Subventions_Infrastructures_Mobilité_2021-{an-1}.html"))
```
```{r}
#| label: tbl-T2
# #| tbl-cap: "Montants des Subventions octroyées pour infrastructures mobilité"
montants_promesses_temp <- stat_mob$promesses_total |>
filter(TYPE == "Promesses_Montant_total") |>
mutate(ANNEE = as.character(ANNEE_PROMESSE),
TOTAL = rowSums(across(c(MOB01, MOB02)), na.rm = TRUE)) |>
arrange(ANNEE) |>
select(ANNEE, TOTAL, MOB01, MOB02)
montants_promesses_tot <- montants_promesses_temp |>
summarise(TOTAL = sum(TOTAL, na.rm = TRUE),
MOB01 = sum(MOB01, na.rm = TRUE),
MOB02 = sum(MOB02, na.rm = TRUE)) |>
mutate(ANNEE = "Total") |>
select(ANNEE, TOTAL, MOB01, MOB02)
montants_promesses <- montants_promesses_tot |>
bind_rows(montants_promesses_temp)
########################################################
t2 <- montants_promesses|>
gt() |>
tab_header(title = md("**Montants des subventions promises pour des infrastructures de recharge de véhicules électriques**"),
subtitle = "Usage privé et public, Vaud")|>
cols_width(everything() ~ pct(100 / ncol(promesses))) |>
tab_style(style = cell_text(weight = "bold"),
locations = list(cells_body(rows = ANNEE == "Total"),
cells_column_labels(),
cells_body(columns = "TOTAL"))) |>
tab_style(
style = cell_text(align = "center"),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(align = "left"),
locations = cells_footnotes()
) |>
tab_style(
style = cell_text(align = "left"),
locations = cells_source_notes()
) |>
cols_align(align = "center") |> #, columns = "Année") |>
cols_label(
ANNEE = "Année",
TOTAL = "Total",
MOB01 = "Usage privé",
MOB02 = "Usage public"
) |>
cols_label_with(
columns = -c("ANNEE"),
fn = \(col) md(paste0(col, "\n\n[CHF]"))
) |>
fmt_number(columns = -ANNEE,
sep_mark = "'",
decimals = 0
) |>
tab_footnote(footnote = "Les deux mesures du Programme Mobilité sont MOB 01 (subvention pour l’infrastructure de recharge à usage privé) et MOB 02 (subvention pour l’infrastructure de recharge à usage public).",
locations = cells_title(groups = "title"),
placement = "right") |>
tab_style(style = cell_borders(sides = "all"),
locations = list(cells_column_labels(), cells_column_spanners())) |>
tab_style(style = cell_borders(sides = c("left", "right")),
locations = list(cells_body())) |>
tab_options(column_labels.border.bottom.color = "black") |>
fmt_missing(columns = everything(), missing_text = "") |>
opt_table_outline(style = "solid", width = px(2), color = "lightgrey") |>
tab_source_note(
source_note = md("*Source: DGE-DIREN<br>Etat au 31.12.2025*")
)
t2
gtsave(t2, glue("./images/t2_Montants_Subventions_Infrastructures_Mobilité_2021-{an-1}.html"))
```
# Méthode {#sec-methode}
Les données proviennent de la base de données SIRENE du Canton de Vaud et concernent les subventions en matière d’infrastructures de recharge des véhicules électriques, qu’il s’agisse de demandes de subventions, de subventions pour lesquelles une décision d’octroi a été prise (subventions promises) ou de subventions payées.
Concernant le nombre de demandes de subventions transmises au Canton, l’année indiquée dans les graphiques correspond à l’année durant laquelle la demande a été déposée. Une subvention est considérée promise lorsque le Canton a confirmé par décision administrative que la demande est éligible. L’année correspond à celle du budget auquel il est rattaché. Pour les subventions payées, l’année indiquée sur l’abscisse des graphiques (@fig-G1 et @fig-G3) correspond à celle où le montant a été versé.
Le cahier technique SIA 2060 fait la distinction entre les niveaux d’équipement des places de stationnement soutenus par la DIREN :
* **Equipement électrique** : ligne d’alimentation vers la borne de recharge, montage du dispositif de protection électrique et d’un éventuel câblage de communication (niveau C1/C2)
* **Borne de recharge** : installation de bornes de recharge prêtes à fonctionner (niveau D)
Par « *borne de recharge* » on entend un point de charge pour un véhicule à la fois. La prise domestique est donc exclue. Les bornes de recharge considérées ici servent à la recharge des automobiles électriques tout comme des véhicules utilitaires légers.
Les deux catégories de *places de stationnement* utilisées dans le cadre de ces subventions sont :
**Usage privé** :
* Installation accessible uniquement au propriétaire (ou locataire le cas échéant), donc réalisée sur une place de parc privative / exclusive au domicile ;
* Installation accessible à un groupe déterminé d’utilisateurs (résidents d’un immeuble, employés d’une entreprise, clients d’un hôtel, etc.). Non ouvert au grand public.
**Usage public** :
* Installation accessible à tous les utilisateurs sans aucune restriction ;
* Installation accessible à tout utilisateur respectant les conditions d’utilisation (horaires, durée, paiement, etc.). Exemple : parking d’un centre commercial ou d’un hôpital.
# Comparaison {#sec-comparaison}
La politique du Canton de Vaud pour l’électromobilité est en phase avec la politique fédérale en la matière. En effet, dans son étude sur les besoins en infrastructures de recharge pour les véhicules électriques ([OFEN, 2023](https://www.newsd.admin.ch/newsd/message/attachments/78060.pdf)), l’Office fédéral de l’énergie (OFEN) a réitéré la demande faite aux cantons de s'investir activement dans le développement des infrastructures de recharge. Les efforts entrepris par le Canton ont porté leurs fruits, comme l’illustrent les chiffres-clés des voitures électriques neuves et de l’infrastructure de recharge publiés par l’OFEN ([OFEN, 2025](https://www.uvek-gis.admin.ch/BFE/storymaps/MO_Kennzahlen_Fahrzeuge/Ladeinfrastruktur_Elektromobilitaet/?lang=fr)). Ceux-ci montrent en effet que le canton de Vaud est en tête des cantons romands en 2025 pour ce qui concerne le taux de nouvelles immatriculations de véhicules électriques et hybrides rechargeables.
# Références {#sec-ref}
<!-- Aide au remplissage : consulter la section correspondante avec `obsindVD::open_aide_remplissage_help()` -->
## Fiches associées {#sec-ref-fiches}
**Fiche Méthode**
* MET_08.05.03.21 Méthodes pour statistiques Subventions Mobilité Bornes de recharge (*disponible sur demande*)
## Autres références {#sec-ref-autres}
* [DGE-DIREN - Conception cantonale de l’énergie (CoCEn 2019)](https://www.vd.ch/fileadmin/user_upload/themes/environnement/energie/fichiers_pdf/CoCEn_Pub_complete_20190816.pdf)
* [Loi fédérale sur la réduction des émissions de CO<sub>2</sub> (Loi sur le CO<sub>2</sub>, 641.71)](https://www.fedlex.admin.ch/eli/cc/2000/148/fr)
* [OCDC - Plan climat vaudois 2ème génération (2025)](https://www.vd.ch/fileadmin/user_upload/themes/environnement/climat/fichiers_pdf/Plan-Climat-2024-web-vf.pdf)
* [OFEN - Etude sur les besoins en infrastructure de recharge pour les véhicules électriques (2023)](https://www.newsd.admin.ch/newsd/message/attachments/78060.pdf)
* [OFEN – Chiffres clés des voitures neuves et de l’infrastructure de recharge (2025)](https://www.uvek-gis.admin.ch/BFE/storymaps/MO_Kennzahlen_Fahrzeuge/Ladeinfrastruktur_Elektromobilitaet/?lang=fr)
# Glossaire {#sec-glossaire}
```{r}
# ---------------------------------------------------------
# Bloc pour lecture du file BRUT où se trouvent toutes les définition pour le glossaire et création du data.frame "definition" ----
# ---------------------------------------------------------
tryCatch(
expr = {readxl::read_excel("P:/DIREN/11 POLITIQUE ENERG/11.08 Indicateurs et stat/1 Indicateurs DIREN/3-Fiches IND MET OBJ/Liste Definitions.xlsx",
skip = 2) |>
janitor::clean_names(case="screaming_snake") |>
select(TERME, DEFINITION) |>
readr::write_csv2("./data/definitions.csv")
},
error = function(e) message("Attention: la table définition n'a pas pu être réactualisée avec les données brutes du P:/ ", e$message),
warning = function(w) message("Attention: la table définition n'a pas pu être réactualisée avec les données brutes du P:/ ", w$message)
)
```
```{r}
# ---------------------------------------------------------
# Bloc pour sélectionner les définitions à apparaître dans le glossaire ----
# ---------------------------------------------------------
# Lecture du file
def_tot <- readr::read_delim(file = "./data/definitions.csv",
delim = ";",
show_col_types = FALSE) |>
# Mettre les premières lettres de chaque définition en majuscule
dplyr::mutate(DEFINITION = stringr::str_replace(DEFINITION,"^\\p{L}",stringr::str_to_upper))
# Sélection des définitions
definitions <- def_tot |>
filter(TERME %in% c(
"Subventions octroyées"
))
# Print de la table avec modification des columns
definitions |>
gt_table_ind() |>
gt::cols_label(TERME = "", DEFINITION ="Définition") |>
gt::tab_options(table.align = "left")
```
# Annexes {#sec-annexes .unnumbered}
## Subventions demandées {.unnumbered}
```{r}
demande_temp <- stat_mob$demandes_total |>
rename(
"MOB01-Usage privé" = "MOB01",
"MOB02-Usage public" = "MOB02",
"ANNEE" = "ANNEE_PROMESSE"
) |>
arrange(ANNEE) |>
mutate(ANNEE = as.character(ANNEE)) |>
relocate(ANNEE, TYPE)
demande <- demande_temp |>
pivot_longer(
cols = -c(ANNEE, TYPE), # toutes les colonnes sauf les deux premières
names_to = "MESURE",
values_to = "NOMBRE"
)
datatable(
demande,
extensions = 'Buttons',
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>',
buttons = c('csv'),
filename = paste0(selected_metadata['Identifiant'], "_infrastructures-mobilite_demandes_annee_", Sys.Date()),
searching = FALSE,
pageLength = 5,
language = list(url = "https://cdn.datatables.net/plug-ins/1.13.6/i18n/fr-FR.json")
)
) |>
formatRound(
columns = c('NOMBRE'),
digits = 0,
mark = "'",
dec.mark = ","
) |>
htmltools::div(style = "width: 70%; margin-left: 0;")
```
## Subventions octroyées {.unnumbered}
```{r}
promesses_temp <- stat_mob$promesses_total |>
filter(TYPE %in% c("Promesses_Nombre", "Promesses_Montant_total") ) |>
rename(
"MOB01-Usage privé" = "MOB01",
"MOB02-Usage public" = "MOB02",
"ANNEE" = "ANNEE_PROMESSE"
) |>
arrange(ANNEE) |>
mutate(ANNEE = as.character(ANNEE)) |>
relocate(ANNEE, TYPE)
promesses <- promesses_temp |>
pivot_longer(
cols = -c(ANNEE, TYPE), # toutes les colonnes sauf les deux premières
names_to = "MESURE",
values_to = "VALEUR"
)
datatable(
promesses,
extensions = 'Buttons',
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>',
buttons = c('csv'),
filename = paste0(selected_metadata['Identifiant'], "_infrastructures-mobilite_promesses_annee_", Sys.Date()),
searching = FALSE,
pageLength = 5,
language = list(url = "https://cdn.datatables.net/plug-ins/1.13.6/i18n/fr-FR.json")
)
) |>
formatRound(
columns = c('VALEUR'),
digits = 0,
mark = "'",
dec.mark = ","
) |>
htmltools::div(style = "width: 70%; margin-left: 0;")
```
## Subventions payées {.unnumbered}
```{r}
paiements_temp <- stat_mob$paiements_total |>
filter(TYPE %in% c("Paiements_Nombre", "Paiements_Montant_total") ) |>
rename(
"MOB01-Usage privé" = "MOB01",
"MOB02-Usage public" = "MOB02",
"ANNEE" = "ANNEE_PAIEMENT"
) |>
arrange(ANNEE) |>
mutate(ANNEE = as.character(ANNEE)) |>
relocate(ANNEE, TYPE)
paiements <- paiements_temp |>
pivot_longer(
cols = -c(ANNEE, TYPE), # toutes les colonnes sauf les deux premières
names_to = "MESURE",
values_to = "VALEUR"
)
datatable(
paiements,
extensions = 'Buttons',
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>',
buttons = c('csv'),
filename = paste0(selected_metadata['Identifiant'], "_infrastructures-mobilite_paiements_annee_", Sys.Date()),
searching = FALSE,
pageLength = 5,
language = list(url = "https://cdn.datatables.net/plug-ins/1.13.6/i18n/fr-FR.json")
)
) |>
formatRound(
columns = c('VALEUR'),
digits = 0,
mark = "'",
dec.mark = ","
) |>
htmltools::div(style = "width: 70%; margin-left: 0;")
```
## Infrastructures de recharge de véhicules électriques avec promesse d'une subvention
```{r}
infrastructures_annexe <- infrastructures_long |>
select(ANNEE, TYPE_LABEL, NOMBRE)
datatable(
infrastructures_annexe,
extensions = 'Buttons',
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>',
buttons = c('csv'),
filename = paste0(selected_metadata['Identifiant'], "_infrastructures-mobilite_bornes-equipements_annee_", Sys.Date()),
searching = FALSE,
pageLength = 5,
language = list(url = "https://cdn.datatables.net/plug-ins/1.13.6/i18n/fr-FR.json")
)
) |>
formatRound(
columns = c('NOMBRE'),
digits = 0,
mark = "'",
dec.mark = ","
) |>
htmltools::div(style = "width: 70%; margin-left: 0;")
```