---
title: "Emissions territoriales de CO<sub>2</sub> liées à l'énergie"
lang: fr
subtitle: "Emissions directes dues à la consommation d'énergie par les installations fixes et les véhicules, 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: 3 # Valeur numérique : 0=Non-défini/1=Description/2=Orientation/3=Pilotage
nature: 3 # Valeur numérique : 0=Non-défini/1=Actions/2=Effets/3=Impacts
idThematique: 08.06.01.01 # 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: Canton # 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: 11 # Valeur numérique : 0=Non-défini/1=Janvier/2=Février, etc.
disponibleDepuis: 2000 # 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: a60ec719-64db-484f-88b1-5c1f708378c8 # !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}
an_max <- 2024
```
```{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 = "Emissions territoriales de CO<sub>2</sub> liées à l'énergie, Vaud <b>[MtCO<sub>2</sub>]</b>", # Par défaut = titre issu de la métadonnée (en-tête du document)
valeur_2024 = 2.6,
obj_2030 = 2.3, # valeur numérique OU icônes de flèches
obj_2040 = NA,
obj_2050 = 1.5,
tendance_observée = icon_down(type = "trend", text = paste0("2019-", an_max)), # icon_up(), icon_flat(), icon_down()
tendance_évaluée = icon_happy() # 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 = "Emissions territoriales de CO<sub>2</sub> liées à l'énergie par habitant, Vaud <b>[tCO<sub>2</sub>/hab]</b>",
valeur_2024 = 3.1,
obj_2030 = icon_down(type = "obj"), # valeur numérique OU icônes de flèches
obj_2040 = NA, #icon_up(type = "obj"), # On peut modifier 'Cible non chiffrée' en modifiant l'argument text = "" par exemple pour ne rien afficher
obj_2050 = icon_down(type = "obj"),
tendance_observée = icon_down(type = "trend", text = paste0("2019-", an_max)), # text obligatoire pour type = 'trend'
tendance_évaluée = icon_happy() #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 informe sur l’évolution des émissions directes de CO<sub>2</sub> dues à la consommation d'énergie par les installations fixes pour la chaleur des bâtiments (chauffage et eau chaude sanitaire) et par les véhicules (hors vapeur d'eau). Cet indicateur permet de suivre les objectifs de la politique énergétique cantonale. Il traduit indirectement l'adoption de nouveaux comportements en matière de consommation d'énergie, le recours à des appareils d'un meilleur rendement énergétique et les progrès dans la gestion de la demande d'énergie. Il ne correspond toutefois pas aux émissions territoriales de gaz à effet de serre du canton de Vaud : les émissions liées à l’agriculture, à la gestion des déchets et aux processus industriels notamment ne sont pas incluses.
# Cadre de référence {#sec-cadre-reference}
Les objectifs des émissions directes de gaz à effet de serre liées à l'énergie 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)) : limiter les émissions de CO<sub>2</sub> annuelles à 2,3 millions de tonnes en 2030 et à 1,5 millions de tonnes en 2050.
Au niveau suisse, le Conseil fédéral a entériné, lors de sa séance du 29 janvier 2025, le nouvel objectif suisse de réduction des gaz à effet de serre, qui concerne la période allant de 2031 à 2035. Cet objectif s’inscrit dans la trajectoire de réduction fixée par la Loi sur le climat et l’innovation ([LCl](https://www.lexfind.ch/fe/fr/tol/34893/versions/249743/fr)), qui fixe l’objectif de neutralité climatique pour 2050. D’ici 2035, notre pays doit réduire ses émissions de gaz à effet de serre d’au moins 65 % par rapport à leur niveau de 1990, et de 59 % en moyenne entre 2031 et 2035 ([OFEV, 2025](https://www.bafu.admin.ch/bafu/fr/home/themes/climat/klimapolitik/climat--affaires-internationales.html)).
# Graphique {#sec-graphique}
```{r}
# ---------------------------------------------------------
# Préparation des données à partir des données brutes
# ---------------------------------------------------------
# 1 - Données de consommation (lecture du document de StatVD: T08.03.01.xls directement depuis leur site)
url_statvd <- "https://www.vd.ch/fileadmin/user_upload/organisation/dfin/statvd/Dom_08/Tableaux/T08.03.01.xlsx"
tryCatch(
expr = {
download.file(url_statvd, destfile = "./data/T08.03.01.xlsx", mode = "wb",
method = "libcurl",
headers = c("User-Agent" = "Mozilla/5.0"))
conso_tj_read <- readxl::read_excel("./data/T08.03.01.xlsx",
skip = 6) |>
janitor::clean_names(case="screaming_snake")
# Nettoyage des données
conso_tj <- conso_tj_read |>
filter(!is.na(AGENT_ENERGETIQUE )) |>
mutate(across(starts_with("X"), as.character)) |>
rename_with(~ stringr::str_extract(.x, "\\d{4}"), tidyselect::starts_with("X")) |>
mutate(AGENT_ENERGETIQUE = recode(AGENT_ENERGETIQUE,"Combustibles" = "Combustibles pétroliers")) |>
slice(2:10)
# Création du file final avec pivot et changement de TJ en GWh
conso_long <- conso_tj |>
pivot_longer(
cols = -AGENT_ENERGETIQUE,
names_to = "ANNEE",
values_to = "TJ"
) |>
mutate(TJ = readr::parse_number(TJ, na = c("…", "...")),
ANNEE = as.numeric(ANNEE),
GWH = TJ /3.6) |>
filter(ANNEE >= 2000) |>
select(AGENT_ENERGETIQUE, ANNEE, TJ, GWH)
# Export du file dans dossier data
write_delim(conso_long,"./data/consommation_finale.csv", delim = ";")
},
error = function(e) stop("Download failed: Il faut vérifier que le doc de StatVD n'a pas changé", e$message),
warning = function(w) stop("Download failed: Il faut vérifier que le doc de StatVD n'a pas changé", w$message)
)
conso_long <- read_delim("./data/consommation_finale.csv", delim = ";") |>
filter(AGENT_ENERGETIQUE %in% c("Combustibles pétroliers", "Carburants", "Gaz", "Charbon"))
# ---------------------------------------------------------
# 2 - Données POPULATION (lecture des données de StatVD qui ont été traitées. Voir code sous 02.11 Bases de données >> POPULATION >> 03_scripts_traitement)
# Variables sont : ANNEE et HABITANTS
tryCatch(
expr = {
read_delim("P:/DIREN/02 PILOTAGE DIREN/02.11 Bases de donnees/POPULATION/04_extractions_traitees/population.csv", delim=";") |>
write_delim("./data/population.csv", delim = ";")
},
error = function(e) message("Attention: la table population n'a pas pu être réactualisée avec les données brutes du P:/ ", e$message)
)
population <- read_delim("./data/population.csv", delim = ";")
# ---------------------------------------------------------
# 3 - Objectifs CoCEn
# A créer une fois
objectifs <- tibble(
ANNEE = c(2030, 2050),
EMISSIONS_TOT = c(2300000, 1500000)
)
write_delim(objectifs,"./data/objectifs.csv", delim = ";")
objectifs <- read_delim("./data/objectifs.csv", delim = ";")
# ---------------------------------------------------------
# 4 - Facteurs d'émissions
#############
# lecture du fichier avec les facteurs d'émissions qu'il faut préalablement préparer chaque année avec les données de l'OFEN)
#############
facteurs_emissions_read <- tryCatch(
{
read_excel("./data/facteurs_emissions.xlsx") |>
janitor::clean_names(case="screaming_snake")
},
error = function(e) message("Attention: la table facteurs_emissions n'a pas pu être réactualisée avec les données brutes du P:/ ", e$message)
)
# Enlever les X qui sont ajoutés devant les années
names(facteurs_emissions_read) <- gsub("^X", "", names(facteurs_emissions_read))
# S'assurer que le document a été complété avec les données de la dernière année
annees_disponibles <- as.integer(names(facteurs_emissions_read)[-1])
derniere_annee <- max(annees_disponibles, na.rm = TRUE)
if (derniere_annee != an_max) {
stop(
paste0(
"Erreur : la dernière année disponible (", derniere_annee,
") ne correspond pas à an_max (", an_max, "). Il faut mettre à jour la table des facteurs "
)
)
}
facteurs_emissions <- facteurs_emissions_read |>
filter(AGENT_ENERGETIQUE %in% c("Combustibles pétroliers", "Carburants", "Gaz", "Charbon"))
```
```{r}
#| label: fig-G1
##| fig-cap: "Emissions territoriales de CO2 liées à l'énergie, Total et par habtant"
#| fig.width: 8
#| fig.asp: 0.6
#_______________________________________________________
# G1 - Emissions territoriales de CO2 liées à l'énergie, Vaud
#_______________________________________________________
facteurs_long <- facteurs_emissions |>
pivot_longer(
-AGENT_ENERGETIQUE,
names_to = "ANNEE",
values_to = "FACTEUR"
) |>
mutate(ANNEE = as.integer(ANNEE))
# Apparier conso_long et facteurs_long pour obtenir les émissions
emissions <- conso_long |>
left_join(facteurs_long, by = c("AGENT_ENERGETIQUE", "ANNEE")) |>
mutate(EMISSIONS = TJ * FACTEUR)
########################################################
# emissions_tot (agréger les émissions totales par année)
emissions_tot <- emissions |>
group_by(ANNEE) |>
summarise(EMISSIONS_TOT = sum(EMISSIONS, na.rm = TRUE))
# emissions_hab (obtenir les emissions par habitant)
emissions_hab <- emissions_tot |>
left_join(population, by = "ANNEE") |>
mutate(EMISSIONS_HAB = (EMISSIONS_TOT) / HABITANTS) |>
select(ANNEE, EMISSIONS_HAB) |>
rename(EMISSIONS_TOT = EMISSIONS_HAB)
# Ajouter un trou pour séparer les consommations des objectifs
last_year <- max(emissions_tot$ANNEE, na.rm = TRUE)
gap1 <- last_year + 1 # entre dernière année et 2030
gap2 <- 2030 + 1 # entre 2030 et 2050
annees_hist <- sort(unique(emissions_tot$ANNEE))
annees_levels <- c(
annees_hist,
gap1,
2030,
gap2,
2050
)
# Ajout les trous à chaque dataset
add_missing_years <- function(df) {
tibble(ANNEE = annees_levels) |>
left_join(df, by = "ANNEE")
}
emissions <- add_missing_years(emissions)
emissions_tot <- add_missing_years(emissions_tot)
emissions_hab <- add_missing_years(emissions_hab)
obj_graf <- add_missing_years(objectifs)
emissions <- emissions |>
mutate(Serie = AGENT_ENERGETIQUE)
emissions_tot <- emissions_tot |>
mutate(Serie = "Emissions CO2")
emissions_hab <- emissions_hab |>
mutate(Serie = "Emissions CO2 / hab")
obj_graf <- obj_graf |>
mutate(Serie = "Objectifs CoCEn")
# Transformer ANNEE en facteur avec ordre
emissions <- emissions |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels))
emissions_tot <- emissions_tot |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels))
emissions_hab <- emissions_hab |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels))
obj_graf <- obj_graf |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels))
# Coefficient
coef <- 1.6*max(emissions_tot$EMISSIONS_TOT, na.rm = TRUE) /
max(emissions_hab$EMISSIONS_TOT, na.rm = TRUE)
g1 <- ggplot() +
# Bars (objectives and consumption)
geom_col_interactive(
data = obj_graf,
aes(x = ANNEE, y = EMISSIONS_TOT, fill = Serie,
tooltip = paste("Objectifs CoCEn ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(EMISSIONS_TOT), " ", "tCO<sub>2</sub>"),
data_id = ANNEE),
width = 0.7
) +
geom_col_interactive(
data = emissions_tot,
aes(x = ANNEE, y = EMISSIONS_TOT, fill = Serie,
tooltip = paste("Emissions CO<sub>2</sub>", " ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(EMISSIONS_TOT), " ", "tCO<sub>2</sub>"),
data_id = paste(Serie, ANNEE)),
width = 0.7
) +
# Line (per capita) – use factor + group = 1
geom_line(
data = emissions_hab,
aes(x = ANNEE, y = EMISSIONS_TOT * coef, color = Serie, group = 1),
linewidth = 0.4,
) +
geom_point_interactive(
data = emissions_hab,
aes(
x = ANNEE,
y = EMISSIONS_TOT * coef,
color = Serie,
tooltip = paste("Emissions CO<sub>2</sub> / habitants", " ", ANNEE, " : " , label_number(accuracy = .1, big.mark = "'")(EMISSIONS_TOT), "tCO<sub>2</sub>/hab"),
data_id = ANNEE
),
size = 2
)+
# Colors
scale_fill_manual(
values = c(
"Emissions CO2" = "#6a8caf",
# "Combustibles pétroliers" = "#c78a92",
# "Carburants" = "#8b4d3b",
# "Gaz" = "#6a8caf",
# "Charbon" = "#4d4d4d",
"Objectifs CoCEn" = "grey80"
),
labels = c(
"Emissions CO2" = "Emissions CO<sub>2</sub> [tCO<sub>2</sub>]",
"Objectifs CoCEn" = "Objectifs CoCEn 2019"
),
name = NULL
) +
scale_color_manual(
values = c("Emissions CO2 / hab" = "#E6550D"),
labels = c( "Emissions CO2 / hab" = "Emissions CO<sub>2</sub> par habitant [tCO<sub>2</sub> / hab]"),
name = NULL
) +
guides(
fill = guide_legend(nrow = 1, byrow = TRUE), # légendes sur 2 lignes d'un histogramme
color = guide_legend(nrow = 1, byrow = FALSE) # légendes sur 2 lignes d'un graphique en ligne
)+
# Y axis with secondary axis
scale_y_continuous(
name = "Emissions en CO<sub>2</sub> [tCO<sub>2</sub>]",
labels = scales::label_number(big.mark = "'", decimal.mark = ".")
,
sec.axis = sec_axis(~ . / coef,
name = "Emissions en CO<sub>2</sub> par habitant [tCO<sub>2</sub> / hab]",
labels = scales::label_number(accuracy = 0.1, big.mark = "'", decimal.mark = "."))
) +
scale_x_discrete(
drop = FALSE,
labels = function(x) {
num_x <- as.numeric(as.character(x))
ifelse(
num_x %in% c(gap1, gap2),
"", # cacher les gaps
ifelse(num_x %% 5 == 0, num_x, "") # afficher seulement tous les 5 ans
)
}
)+
# Titles and caption
labs(
title = md("**Emissions territoriales de CO<sub>2</sub> liées à l'énergie**"),
subtitle = str_wrap("Estimations des émissions dues à la consommation d'énergie par les installations fixes et les véhicules, total et par habitant, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>"),
x = NULL,
caption = "Source: StatVD / DGE-DIREN<br>Etat au 25.11.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"), # !! MWR: 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_text(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.y = ggtext::element_markdown(size = 10),
axis.title.y.right = ggtext::element_markdown(size = 10)
)
obsindVD::girafe_light(g1,
# modification du comportement de surlignage : on ajoute 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_Emissions_CO2_Total-Habitant_2000-{an_max}.png"), width = 8, height = 6, dpi = 300)
```
```{r}
#| label: fig-G2
##| fig-cap: "Emissions territoirales de CO2 liées à l'énergie, par agent énergétique, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
#_______________________________________________________
# G2 - Emissions territoriales de CO2 liées à l'énergie par agent énergétique, Vaud
#_______________________________________________________
facteurs_long <- facteurs_emissions |>
pivot_longer(
-AGENT_ENERGETIQUE,
names_to = "ANNEE",
values_to = "FACTEUR"
) |>
mutate(ANNEE = as.integer(ANNEE))
# Apparier conso_long et facteurs_long pour obtenir les émissions
emissions <- conso_long |>
left_join(facteurs_long, by = c("AGENT_ENERGETIQUE", "ANNEE")) |>
mutate(EMISSIONS = TJ * FACTEUR)
emissions <- emissions |>
mutate(Serie = AGENT_ENERGETIQUE)
g2 <- ggplot() +
geom_line(
data = emissions,
aes(x = ANNEE, y = EMISSIONS , color = Serie, group = Serie),
linewidth = 1.0,
) +
geom_point_interactive(
data = emissions,
aes(
x = ANNEE,
y = EMISSIONS,
color = Serie,
group = Serie,
tooltip = paste(Serie |> str_remove("\\[.*\\]"), ANNEE, " : " , label_number(accuracy = 1, big.mark = "'")(EMISSIONS), "tCO<sub>2</sub>"),
data_id = ANNEE
),
size = 2
)+
guides(
color = guide_legend(nrow = 2, byrow = FALSE) # légendes sur 2 lignes d'un graphique en ligne
)+
scale_color_manual(
values = c(
"Carburants" = "#8b4d3b",
"Gaz" = "#6a8caf",
"Combustibles pétroliers" = "#c78a92",
"Charbon" = "#4d4d4d"
),
breaks = c(
"Carburants",
"Gaz",
"Combustibles pétroliers",
"Charbon"
),
labels = c(
"Carburants" = "Carburants",
"Gaz" = "Gaz",
"Combustibles pétroliers" = "Combustibles pétroliers",
"Charbon" = "Charbon"
),
name = NULL
) +
scale_y_continuous(
name = "Emissions en CO<sub>2</sub> [tCO<sub>2</sub>]",
# name = expression("Emissions en CO"[2] * " (tCO"[2] * ")"),
labels = scales::label_number(big.mark = "'", decimal.mark = ".")
) +
scale_x_discrete(
drop = FALSE,
breaks = function(x) {
num_x <- as.numeric(as.character(x))
x[num_x %% 5 == 0 & !(num_x %in% c(gap1, gap2))]
}
)+
# Titles and caption
labs(
title = str_wrap("**Emissions territoriales de CO<sub>2</sub> liées à l'énergie, selon les agents énergétique**", width = 73) |>
stringr::str_replace_all("\n", "<br>") |>
md(),
subtitle = str_wrap("Estimations des émissions dues à la consommation d'énergie par les installations fixes et les véhicules, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") |>
md(),
x = NULL,
caption = "Source: StatVD / DGE-DIREN<br>Etat au 25.11.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"), # !! MWR: rajout italic
plot.caption.position = "plot",
plot.margin = margin(10, 10, 30, 10),
legend.position = "bottom", # "top" "left" "right" "none" "bottom"
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.y = element_markdown(size = 10)
)
obsindVD::girafe_light(g2,
# modification du comportement de surlignage : on ajoute 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_Emissions_CO2_Agents_energetiques_2000-{an_max}.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}
Après un niveau record en 2003 avec 3,5 millions de tonnes, les émissions territoriales de CO<sub>2</sub> liées à l'énergie ont continuellement baissé pour atteindre 2,6 millions de tonnes en 2024. Trois quarts des émissions sont dues à la consommation de produits pétroliers (2024 : 74%), dont plus de deux tiers (2024 : 71%) concernent les carburants.
Les émissions territoriales de CO<sub>2</sub> par habitant ont baissé de 3,8 tonnes en 2019 à 3,1 tonnes en 2024.
## Interprétation {#sec-analyse-interpretation}
Malgré la tendance positive des mesures visant l’amélioration de l’efficacité énergétique, certains facteurs ont contribué à l’augmentation des émissions directes de CO<sub>2</sub>, tels que la consommation à la hausse (chauffage et mobilité individuelle) due à la croissance démographique.
L’évolution est qualifiée de bonne : si la diminution observée entre 2019 et 2024 est maintenue, cela devrait permettre d’atteindre les valeurs cibles fixées dans la Conception cantonale de l’énergie pour le moyen terme (2030).
## Périmètre et limites {#sec-analyse-perimetre}
Les émissions directes ne tiennent compte que de la combustion sur le territoire du canton de Vaud de combustibles pour la chaleur des bâtiments et de carburants pour le transport des véhicules. Ne sont pas inclus les émissions liées aux importations d'électricité, à l’agriculture, à la gestion des déchets et aux processus industriels, ainsi que celles provenant de l'énergie grise des produits importés.
Les valeurs se réfèrent aux émissions brutes sans déduction des prestations de puits de carbone.
A moyen terme, il serait souhaitable d’effectuer des relevés de toutes les émissions de gaz à effet de serre. En effet, la contribution des différents gaz à effet de serre est très variable et dépend des quantités émises et de leur potentiel de réchauffement. En Suisse, le CO<sub>2</sub> est de loin le principal gaz à effet de serre, avec une part de plus de 80%.
# Tableaux {#sec-tableaux}
```{r}
#| label: tbl-T1
##| tbl-cap: Emissions Co2 liées à l'énergie, agents énergétiques et ar habitant, Vaud
emissions_tot_wide <- emissions_tot |>
select(ANNEE, EMISSIONS_TOT) |>
mutate(ANNEE = as.integer(as.character(ANNEE)))
emissions_hab_wide <- emissions_hab |>
rename(EMISSIONS_HAB = EMISSIONS_TOT) |>
select(ANNEE, EMISSIONS_HAB) |>
mutate(ANNEE = as.integer(as.character(ANNEE)))
emissions_ae_wide <- emissions |>
select(ANNEE, AGENT_ENERGETIQUE, EMISSIONS) |>
pivot_wider(names_from = AGENT_ENERGETIQUE, values_from = EMISSIONS) |>
mutate(ANNEE = as.integer(ANNEE))
df <- emissions_tot_wide |>
bind_rows(objectifs |> mutate(ANNEE = as.integer(ANNEE))) |>
filter(!is.na(EMISSIONS_TOT)) |>
left_join(emissions_ae_wide, by = "ANNEE") |>
left_join(emissions_hab_wide, by = "ANNEE")
# df <- df |>
# mutate(ANNEE = as.numeric(as.character(ANNEE)))
#
# emissions <- emissions |>
# mutate(ANNEE = as.numeric(as.character(ANNEE)))
t1 <- df |>
mutate(across(where(is.numeric), \(col) na_if(col, y = 0))) |> # on change les 0 en NA comme ça sub_missing() ci-après transforme les 0 et les NA en "-" (par exemple)
select(where(~ !all(is.na(.)))) |>
# Years multiple of 5, OR the 5 latest years
# filter(
# as.numeric(as.character(ANNEE)) %% 5 == 0 |
# as.numeric(as.character(ANNEE)) >= max(as.numeric(as.character(emissions$ANNEE))) - 4) |>
filter(
ANNEE %% 5 == 0 |
ANNEE >= max(emissions$ANNEE) - 4) |>
gt() |>
tab_header(title = md("**Emissions territoriales de CO<sub>2</sub> liées à l'énergie**"), # !! MWR: ajout du titre en gras avec md() + syntaxe **
subtitle = md(paste0(
str_wrap("Emissions dues à la consommation d'énergie par les installations fixes et les véhicules, par agent énergétique et par habitant, Vaud", width = 60),
"<span> </span>")
) )|>
fmt_number(columns = -c(ANNEE, EMISSIONS_HAB), sep_mark = "'", decimals = 0) |>
fmt_number(columns = EMISSIONS_HAB, sep_mark = "'", decimals = 1) |>
cols_label(
ANNEE = "Année",
EMISSIONS_TOT = "Total",
EMISSIONS_HAB = "Par habitant"
) |>
cols_width(everything() ~ pct(100 / ncol(df))) |>
tab_style(style = cell_text(weight = "bold"),
locations = list(cells_body(columns = c("ANNEE", "EMISSIONS_TOT", "EMISSIONS_HAB")),
cells_column_labels(columns = c("ANNEE", "EMISSIONS_TOT", "EMISSIONS_HAB")))) |>
tab_style(
style = cell_text(align = "center"),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(align = "left"),
locations = cells_column_labels(columns = ANNEE)
) |>
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 = -ANNEE) |>
cols_align(align = "left", columns = ANNEE) |>
cols_label_with(
columns = -c(ANNEE, EMISSIONS_HAB),
fn = \(col) md(paste0(col, "\n\n[tCO<sub>2</sub>]"))
) |>
cols_label_with(
columns = EMISSIONS_HAB,
fn = \(col) md(paste0(col, "\n\n(tCO<sub>2</sub> / hab)"))
) |>
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") |>
sub_missing(columns = everything(), missing_text = "-") |> # remplacé la gestion des NA par '-' au lieu de ''
tab_footnote(footnote = "Objectifs fixés dans la conception cantonale de l'énergie (CoCEn 2019).",
locations = cells_body(columns = ANNEE, rows = ANNEE > year(Sys.Date())),
placement = "right") |>
tab_footnote(footnote = "Non compris les émissions liées à l’agriculture, à la gestion des déchets et aux processus industriels.",
locations = cells_title(groups= "title"),
placement = "right") |>
tab_style(
style = cell_borders(sides = "top", style = "dashed", color = "lightgrey", weight = px(1)),
locations = cells_body(rows = ANNEE == min(objectifs$ANNEE)) # applies to first row
) |>
opt_table_outline(style = "solid", width = px(2), color = "lightgrey")|>
tab_source_note(
source_note = md("*Sources : StatVD / DGE-DIREN<br>Etat au 25.11.2025*")
)
t1
gtsave(t1, glue("./images/t1_Emissions_CO2_Agent_energetique_Habitant_2000-{an_max}.html"))
```
# Méthode {#sec-methode}
La statistique des émissions de gaz à effet de serre se base sur la statistique de synthèse établie par Statistique Vaud concernant la consommation finale d’énergie par agent énergétique. Cette dernière est obtenue à partir de plusieurs enquêtes relatives à la « consommation finale d'énergie » (électricité, combustibles et carburants). Ces données sont issues de la production périodique de StatVD. La consommation par agent énergétique (en térajoules, TJ) se multiplie ensuite par un facteur d’émission (FE) qui doit être ajusté selon [l’inventaire national des gaz à effet de serre de l’Office fédéral de l’environnement (OFEV)](https://www.bafu.admin.ch/dam/bafu/fr/dokumente/klima/fachinfo-daten/CO2_Emissionsfaktoren_THG_Inventar.pdf).
# Comparaison {#sec-comparaison}
Un indicateur proche mais non comparable d'un point de vue méthodologique (Émissions de CO<sub>2</sub>) figure dans le [système d'indicateurs de développement durable MONET](https://www.vd.ch/etat-droit-finances/statistique/statistiques-par-domaine/21-developpement-durable) (Émissions de gaz à effet de serre).
# Références {#sec-ref}
<!-- Aide au remplissage : consulter la section correspondante avec `obsindVD::open_aide_remplissage_help()` -->
## Fiches associées {#sec-ref-fiches}
**Fiches Méthode** :
* MET_08.01.01.01 : Méthode pour le calcul de la consommation finale d'énergie (*disponible sur demande*)
**Fiches Indicateur** :
* [IND_08.01.01.01 : Consommation finale d'énergie, Vaud](https://stat-climat-vd.ch/fiches-indicateurs/themes/energie/IND_08.01.01.01_Consommation_finale.html)
## 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)
* [OFEV - Facteurs d’émission de CO<sub>2</sub> selon l’inventaire des gaz à effet de serre de la Suisse](https://www.bafu.admin.ch/dam/bafu/fr/dokumente/klima/fachinfo-daten/CO2_Emissionsfaktoren_THG_Inventar.pdf)
* [OCDC - Système d’indicateurs de développement durable MONET pour le canton de Vaud](https://www.vd.ch/etat-droit-finances/statistique/statistiques-par-domaine/21-developpement-durable)
* [Conseil d’Etat du Canton de Vaud, Programme de législature 2022-2027 (2022)](https://www.vd.ch/fileadmin/user_upload/organisation/ce/fichiers_pdf/PL2022-2027_vFINAL-petit.pdf)
* [OFEV – Climat affaires internationales](https://www.bafu.admin.ch/bafu/fr/home/themes/climat/klimapolitik/climat--affaires-internationales.html)
# 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(
"1 Gigawatheure (GWh)",
"Combustibles pétroliers",
"Carburants",
"Emissions territoriales",
"Gaz à effet de serre (GES)",
"Puits de carbone"
))
# Ajouter Agents énergétiques
# 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}
## Emissions CO<sub>2</sub> par agent énergétique et année {.unnumbered .unlisted}
```{r}
emissions_ae <- emissions |>
select(ANNEE, AGENT_ENERGETIQUE, EMISSIONS) |>
rename(tCO2 = EMISSIONS)
# Consommation finale par agent énergétique
datatable(
emissions_ae,
extensions = 'Buttons',
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>',
buttons = c('csv'),
filename = paste0(selected_metadata['Identifiant'], "_emissions_co2_ae_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 = 'tCO2',
digits = 0,
mark = "'",
dec.mark = ","
) |>
htmltools::div(style = "width: 70%; margin-left: 0;")
```
## Population résidante permanente par année {.unnumbered .unlisted .hidden}
```{r}
datatable(
population,
extensions = 'Buttons', # Active l'extension pour les boutons
rownames = FALSE,
options = list(
autoWidth = TRUE,
dom = '<"top"fB>rt<"bottom"ip>', # B = Buttons, t = table, p = pagination
buttons = c('csv'), # Formats de téléchargement
filename = paste0(selected_metadata['Identifiant'], "_pop_par_année_", Sys.Date()), # Nom du fichier
searching = FALSE, # Supprime la case "Search"
pageLength = 5, # Nombre de lignes par défaut
language = list(url = "https://cdn.datatables.net/plug-ins/1.13.6/i18n/fr-FR.json")
)
) |>
formatRound(
columns = 'HABITANTS',
digits = 0,
mark = "'", # Séparateur de milliers
dec.mark = "," # Séparateur de décimales
) |>
htmltools::div(style = "width: 50%; margin-left: 0;")
```