---
title: "Production électrique de source solaire"
subtitle: "Electricité autoconsomée ou injectée dans le réseau, Vaud"
lang: fr
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: 2 # Valeur numérique : 0=Non-défini/1=Actions/2=Effets/3=Impacts
idThematique: 08.02.05.11 # 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: Installation # 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: 7 # Valeur numérique : 0=Non-défini/1=Janvier/2=Février, etc.
disponibleDepuis: 2015 # 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: 6d80a781-2940-4bed-8698-6e3b0e08ffcd # !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 quelle est l'année maximale recherchée (permet d'automatiser la recherche du bon dossier et fichier pour les données PRONOVO)
an_max <- 2025
```
```{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 = "Production d'électricité photovoltaïque, Vaud <b>[GWh]</b>", # Par défaut = titre issu de la métadonnée (en-tête du document)
valeur_2025 = 638,
obj_2030 = 900, # valeur numérique OU icônes de flèches
obj_2040 = NA,
obj_2050 = 1600,
tendance_observée = icon_up(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 = "Production d'électricité photovoltaïque par habitant, Vaud <b>[kWh/hab]</b>",
valeur_2025 = 739,
obj_2030 = icon_up(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_up(type = "obj"),
tendance_observée = icon_up(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 la quantité totale d'électricité produite annuellement à partir d'installations photovoltaïques situées sur le territoire vaudois, que l'électricité soit injectée dans le réseau ou autoconsommée par le producteur. Il traduit l’évolution de la production électrique locale de source solaire.
# Cadre de référence {#sec-cadre-reference}
Les objectifs de la production d'électricité photovoltaïque sont définis dans la Conception cantonale de l’énergie (CoCEn 2019). L’objectif est d’atteindre une production de 900 GWh<sub>él</sub> par an à l’horizon de 2030. Pour 2050, l’objectif est de produire chaque année 1600 GWh<sub>él</sub> à partir d'installations photovoltaïques.
# Graphique {#sec-graphique}
```{r}
# ---------------------------------------------------------
# Préparation des données à partir des données brutes
# ---------------------------------------------------------
# 1 - Données de production électrique (lecture des données traitées (en kWh) sous meta_pronovo_résumé_2015-2022_2023-05-17.xlsx onglet qui se trouve sous: P:\DIREN\02 PILOTAGE DIREN\02.11 Bases de donnees\PRONOVO\04_extractions_traitees))
tryCatch(
expr = {
# Chemin du dossier
dossier <- glue("P:/DIREN/02 PILOTAGE DIREN/02.11 Bases de donnees/PRONOVO/04_extractions_traitees/Resultats_{an_max}")
# Lister tous les fichiers qui commencent par "meta_pronovo_résumé_2015-" et contiennent an_max (défini plus tôt)
fichiers <- list.files(
path = dossier,
pattern = glue("^meta_pronovo_résumé_2015-{an_max}.*\\.xlsx$"),
full.names = TRUE
)
# Extraire la date finale du nom de fichier et garder le plus récent
fichier_sel <- fichiers |>
tibble::enframe(name = NULL, value = "fichier") |>
mutate(
# extraire la date sous forme YYYY-MM-DD
date_fin = str_extract(fichier, "\\d{4}-\\d{2}-\\d{2}"),
date_fin = as.Date(date_fin)
) |>
arrange(desc(date_fin)) |> # trier par date décroissante
slice(1) |> # garder le premier (plus récent)
pull(fichier) # extraire le chemin complet
pronovo_detaille <- read_xlsx(fichier_sel,
sheet = "Détaillé")|>
janitor::clean_names(case="screaming_snake")
production_temp <- pronovo_detaille |>
# rename_with(~ stringr::str_extract(.x, "\\d{4}"), tidyselect::starts_with("X")) |>
# Sélectionner uniquement la ressource
filter(CATEGORIE_DIREN == "Solaire") |>
# Convertir ANNEE en numérique pour pouvoir trier ou filtrer
mutate(ANNEE = as.integer(ANNEE),
PRODUCTION_GWH = PRODUCTION/1e6,
INJECTION_GWH = INJECTION/1e6,
AUTOCONSOMMATION_GWH = AUTOCONSOMMATION/1e6,
PUISSANCE_MW = PUISSANCE_ELECTRIQUE_INSTALLEE_KW/1e3) |>
select(-c(PRODUCTION, INJECTION, AUTOCONSOMMATION, PUISSANCE_ELECTRIQUE_INSTALLEE_KW))
# en faire un pivot long
production_solaire <- production_temp |>
pivot_longer(
cols = -c(ANNEE, CATEGORIE_DIREN),
names_to = "VARIABLE",
values_to = "VALEUR" ) |>
select(-CATEGORIE_DIREN)
# Export du file dans dossier data
write_delim(production_solaire,"./data/production_solaire.csv", delim = ";")
},
error = function(e) stop(paste("Download failed: Il faut vérifier que le doc soit toujours ok", e$message)),
warning = function(w) stop(paste("Download failed: Il faut vérifier que le doc soit toujours ok", w$message))
)
production_solaire <- read_delim("./data/production_solaire.csv", delim = ";")
# ---------------------------------------------------------
# 2 - Population
# 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 = ";") |>
filter(ANNEE >= 2015 & ANNEE <= an_max)
# ---------------------------------------------------------
# 3 - Objectifs CoCEn
# A créer une fois
# objectifs <- tibble(
# ANNEE = c(2030, 2050),
# VALEUR = c(900, 1600)
# )
# write_delim(objectifs,"./data/objectifs.csv", delim = ";")
objectifs <- read_delim("./data/objectifs.csv", delim = ";")
```
```{r }
#| label: fig-G1
##| fig-cap: "Production électrique de source solaire: électricité autoconsommée et soutirée du réseau, Vaud"
#| fig.width: 8
#| fig.asp: 0.6
#_______________________________________________________
# G1 - Production électrique de source solaire: électricité autoconsommée et soutirée du réseau, Vaud
#_______________________________________________________
# prod_solaire : uniquement INJECTION_GWH et AUTOCONSOMMATION_GWH
prod_solaire <- production_solaire |>
filter(VARIABLE %in% c("INJECTION_GWH", "AUTOCONSOMMATION_GWH"))
# prod_tot : uniquement total de production
prod_tot <- production_solaire |>
filter(VARIABLE == "PRODUCTION_GWH")
# Conso_hab (obtenir la consommation par habitant)
prod_hab <- prod_tot |>
left_join(population, by = "ANNEE") |>
mutate(KWH_HAB = (VALEUR*1e6) / HABITANTS) |>
select(ANNEE, KWH_HAB) |>
rename(VALEUR = KWH_HAB) |>
mutate(VARIABLE = "Production par habitant [kWh / hab]")
# Ajouter un trou pour séparer les consommations des objectifs
last_year <- max(prod_solaire$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(prod_solaire$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")
}
prod_solaire <- add_missing_years(prod_solaire)
prod_solaire <- prod_solaire |>
filter(!is.na(VALEUR), !is.na(VARIABLE))
prod_hab <- add_missing_years(prod_hab)
obj_graf <- add_missing_years(objectifs) |>
filter(!is.na(VALEUR))
# Transformer ANNEE en facteur avec ordre
prod_solaire <- prod_solaire |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels)) |>
mutate(VARIABLE = factor(VARIABLE, levels = c("INJECTION_GWH", "AUTOCONSOMMATION_GWH")))
prod_hab <- prod_hab |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels))
obj_graf <- obj_graf |>
mutate(ANNEE = factor(ANNEE, levels = annees_levels)) |>
mutate(VARIABLE = "Objectifs CoCEn 2019")
# Coefficient
coef <- 1.2*max(objectifs$VALEUR, na.rm = TRUE) /
max(prod_hab$VALEUR, na.rm = TRUE)
prod_solaire <- prod_solaire |>
tidyr::complete(
ANNEE,
VARIABLE = c("INJECTION_GWH", "AUTOCONSOMMATION_GWH"),
fill = list(VALEUR = 0)
)
prod_solaire <- prod_solaire |>
mutate(
VARIABLE = recode(VARIABLE,
INJECTION_GWH = "Electricité injectée dans le réseau",
AUTOCONSOMMATION_GWH = "Electricité autoconsommée"
)
)
g1_plot <- ggplot() +
# Bars (objectives )
geom_col_interactive(
data = obj_graf,
aes(x = ANNEE, y = VALEUR, fill = VARIABLE,
tooltip = paste(VARIABLE |> str_remove("\\[.*\\]"), ":", label_number(accuracy = 1, big.mark = "'")(VALEUR), "GWh"),
data_id = ANNEE),
width = 0.7,
position = position_nudge(x = -0.05),
color = NA
) +
# Barres empilées (autoconsommation et réseau)
geom_col_interactive(
data = prod_solaire,
aes(x = ANNEE, y = VALEUR, fill = VARIABLE, #était Serie
color = VARIABLE,
tooltip = paste(VARIABLE |> str_remove("\\[.*\\]"), " ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(VALEUR), "GWh"),
data_id = ANNEE),
width = 0.7,
position = "stack",
color = NA
) +
# Line (per capita) – use factor + group = 1
geom_line(
data = prod_hab,
aes(x = ANNEE, y = VALEUR * coef, color = VARIABLE, group = 1),
linewidth = 1.2,
) +
geom_point_interactive(
data = prod_hab,
aes(
x = ANNEE,
y = VALEUR * coef,
color = VARIABLE,
tooltip = paste(VARIABLE |> str_remove("\\[.*\\]"), " ", ANNEE, " : ", label_number(accuracy = 1, big.mark = "'")(VALEUR), "kWh/hab"),
data_id = ANNEE
),
size = 1.5
)+
# ajout des valeurs au-dessus des colonnes
geom_text(
data = prod_tot |> bind_rows(objectifs), # ajout des objectifs au cas où
inherit.aes = FALSE,
aes(
x = as.factor(ANNEE),
y = VALEUR,
label = label_number(accuracy = 1, big.mark = "'")(VALEUR)
),
vjust = -0.5,
size = 3
) +
scale_fill_manual(
values = c(
"Electricité autoconsommée" = "#1b9e77",
"Electricité injectée dans le réseau" = "#f0d47a",
"Objectifs CoCEn 2019" = "grey80"
),
breaks = c("Electricité autoconsommée", "Electricité injectée dans le réseau", "Objectifs CoCEn 2019"),
labels = c(
"Electricité autoconsommée" = "Electricité autoconsommée",
"Electricité injectée dans le réseau" = "Electricité injectée dans le réseau",
"Objectifs CoCEn 2019" = "Objectifs CoCEn 2019"
),
name = NULL,
na.translate = FALSE # afin d'éviter que NA apparaisse dans la légende
) +
guides(
fill = guide_legend(nrow = 2, byrow = TRUE, label.theme = element_text(size = 10)),
color = guide_legend(nrow = 1, byrow = FALSE)
)+
scale_color_manual(
values = c(
"Electricité autoconsommée" = "#1b9e77",
"Electricité injectée dans le réseau" = "#f0d47a",
"Objectifs CoCEn 2019" = "grey80",
"Production par habitant [kWh / hab]" = "#E6550D"
),
name = NULL,
na.translate = FALSE # afin d'éviter les NA dans la légende
)+
# Y axis with secondary axis
scale_y_continuous(
name = "Production d'électricité (GWh)",
labels = scales::label_number(big.mark = "'", decimal.mark = "."),
sec.axis = sec_axis(~ . / coef,
name = "Production par habitant [kWh / hab]",
labels = scales::label_number(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
)
}
)+
# Titre en gras sur 2 lignes
labs(
title = str_wrap("**Production électrique de source solaire : total et par habitant**", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
# Sous-titre sur deux lignes
subtitle = str_wrap("Electricité autoconsommée ou injectée dans le réseau, Vaud", width = 73) |>
stringr::str_replace_all("\n", "<br>") ,
x = NULL,
caption = "Source: Pronovo / DGE-DIREN<br>Etat au 31.12.2025" # <br> pour
) +
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", #"vertical"
legend.box.just = "left", # aligne les blocs à gauche
legend.justification = "left",
legend.text = element_text(size = 10, lineheight = 0.9),
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 = element_text(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_Production_electricite_solaire_2015-{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}
L’électricité photovoltaïque produite sur le territoire vaudois a augmenté de 20% par année en moyenne entre 2019 (213 GWh<sub>él</sub>) et 2025 (638 GWh<sub>él</sub>) (voir @fig-G1). Cette production électrique correspond à 739 kWh<sub>él</sub> par habitant. La majorité (68%; 434 GWh<sub>él</sub>) de cette électricité produite en 2025 a été injectée dans les réseaux électriques et 32% (204 GWh<sub>él</sub>) ont été consommés sur place (autoconsommation). L'objectif est d'atteindre une production totale annuelle de 900 GWh<sub>él</sub> d’origine solaire à moyen terme (2030) et de 1’600 GWh<sub>él</sub> à long terme (2050).
L’électricité produite à partir d'installations solaires photovoltaïques correspond à 38% de l’ensemble de l’électricité produite de sources renouvelables dans le canton de Vaud en 2025.
## Interprétation {#sec-analyse-interpretation}
L’évolution de la production d'électricité photovoltaïque est considérée comme bonne : si la hausse observée entre 2019 et 2025 est maintenue, les valeurs cibles fixées pour le moyen terme (2030) devraient être atteintes.
## Périmètre et limites {#sec-analyse-perimetre}
La production d’électricité d’origine solaire photovoltaïque est sous-évaluée du fait que les données ne recensent que les installations annoncées à Pronovo (organe d’exécution pour les programmes d’encouragement des énergies renouvelables) qui injectent de l’électricité dans le réseau.
Il manque par conséquent les petites installations d’une puissance inférieure à 2 kW, ainsi que celles d’une puissance comprise entre 2 et 30 kW qui ne sont pas sous le régime des garanties d’origine (GO), c’est-à-dire qui ne bénéficient pas d’une subvention fédérale (sous forme d’une contribution d’investissement (rétribution unique (RU)) ou d’une rétribution de l’injection (rétribution à prix coûtant (RPC))).
La production électrique issue de l’énergie solaire est variable aussi bien au fil des jours que des saisons et peut varier d’une année sur l’autre même sans changement du parc d’installations photovoltaïques.
# Tableaux {#sec-tableaux}
```{r}
#| label: tbl-T1
##| tbl-cap: Production électrique de source solaire, Vaud
# Changer nom de variable chez prod_hab
prod_hab_wide <- prod_hab |>
rename(KWH_HAB = VALEUR) |>
mutate(ANNEE = as.integer(as.character(ANNEE)))
prod_solaire_wide <- prod_solaire |>
pivot_wider(names_from = VARIABLE, values_from = VALEUR) |>
mutate(ANNEE = as.integer(as.character(ANNEE))) |>
mutate(across(-ANNEE,~ if_else(ANNEE > an_max, NA_real_, .)))
prod_tot_wide <- prod_tot |>
rename(TOT_GWH = VALEUR) |>
mutate(ANNEE = as.integer(as.character(ANNEE))) |>
select(ANNEE, TOT_GWH)
obj_wide <- objectifs |>
rename(TOT_GWH = VALEUR)
df <- prod_tot_wide |>
bind_rows(obj_wide |> mutate(ANNEE = as.integer(ANNEE))) |>
filter(!is.na(TOT_GWH)) |>
left_join(prod_solaire_wide, by = "ANNEE") |>
left_join(prod_hab_wide, by = "ANNEE") |>
select(ANNEE, TOT_GWH, "Electricité injectée dans le réseau", "Electricité autoconsommée", KWH_HAB)
t1 <- df |>
mutate(across(everything(), \(col) na_if(col, y = 0))) |> # !! MWR: on change les 0 en NA comme ça sub_missing() ci-après transforme les 0 et les NA en "-" (par exemple)
gt() |>
tab_header(title = md("**Production électrique de source solaire: total et par habitant**"),
subtitle = "Electricité injectée dans le réseau ou autoconsommée") |>
fmt_number(columns = -ANNEE, sep_mark = "'", decimals = 0) |>
cols_label(
ANNEE = "Année",
TOT_GWH = "Total",
"Electricité autoconsommée" = "Electricité autoconsommée",
"Electricité injectée dans le réseau" = "Electricité injectée dans le réseau",
KWH_HAB = "Par habitant"
) |>
cols_width(everything() ~ pct(100 / ncol(df))) |>
tab_style(style = cell_text(weight = "bold"),
locations = list(cells_body(columns = c("ANNEE", "TOT_GWH", "KWH_HAB")),
cells_column_labels(columns = c("ANNEE", "TOT_GWH", "KWH_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_borders(sides = "top", style = "dashed", color = "lightgrey", weight = px(1)),
locations = cells_body(rows = ANNEE == min(objectifs$ANNEE)) # applies to first row
) |>
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_style(
style = cell_text(align = "left"),
locations = list(cells_footnotes(), cells_source_notes())
) |>
cols_align(align = "center", columns = -ANNEE) |>
cols_align(align = "left", columns = ANNEE) |>
cols_label_with(
columns = -c(ANNEE, KWH_HAB),
fn = \(col) md(paste0(col, "\n\n[GWh]"))
) |>
cols_label_with(
columns = KWH_HAB,
fn = \(col) md(paste0(col, "\n\n[kWh / hab]"))
) |>
tab_options(column_labels.border.bottom.color = "black") |>
fmt_missing(columns = everything(), missing_text = "-") |>
tab_footnote(footnote = "Objectifs de la Conception cantonale de l'énergie (CoCEn 2019).",
locations = cells_body(columns = ANNEE, rows = ANNEE > year(Sys.Date())),
placement = "right") |>
tab_footnote(footnote = "Electricité produite et consommée sur place sans injection dans le réseau.",
locations = cells_column_labels(columns = "Electricité autoconsommée"),
placement = "right") |>
opt_table_outline(style = "solid", width = px(2), color = "lightgrey") |>
tab_source_note(
source_note = md("*Sources : Pronovo / DGE-DIREN<br>Etat au 31.12.2025*")
)
t1
gtsave(t1, glue("./images/t1_Production_electricite_solaire_2015-{an_max}.html"))
```
# Méthode {#sec-methode}
Les quantités d’électricité d’origine solaire injectées dans le réseau sont fournies par Pronovo. Les quantités autoconsommées par les producteurs sont estimées à partir des informations de puissance installée. Des informations plus détaillées se trouvent dans la fiche méthode (voir @sec-ref-fiches).
# Comparaison {#sec-comparaison}
Une étude de la [Fondation suisse de l’énergie (SES, 2025)](https://energiestiftung.ch/files/energiestiftung/Studien/2025_Laendervergleich_Solar-Wind-Stromproduktion/20250611_SES-Studie_L%C3%A4ndervergleich_2024.pdf) présente les productions d’électricité de source solaire et éolienne en Suisse et dans les 27 Etats membres de l’Union européenne en 2024. Avec une production de 681 kWh par habitant d’électricité de source solaire, la Suisse se trouve dans la moyenne européenne. Les pays avec la plus forte production par habitant sont les Pays-Bas (1'206 kWh/hab) et l’Espagne (1'104 kWh/hab), nettement supérieure à celle observée pour le canton de Vaud (550 kWh/hab).
# 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.02.02.02 : Méthode pour le calcul de la production d'électricité (*disponible sur demande*)
**Fiches Indicateur** :
* [IND_08.02.02.01 : Production électrique de sources renouvelables et non renouvelables, Vaud](https://stat-climat-vd.ch/fiches-indicateurs/themes/energie/IND_08.02.02.01_Production_Electrique_Total.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)
* [Fondation suisse de l’énergie - Produktion von Solar- und Windenergie der Schweiz im europäischen Vergleich (SES, 2025)](https://energiestiftung.ch/files/energiestiftung/Studien/2025_Laendervergleich_Solar-Wind-Stromproduktion/20250611_SES-Studie_L%C3%A4ndervergleich_2024.pdf)
# 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(
"Gigawattheure (GWh)",
"Autoconsommation",
"Puissance installée"
))
# 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}
<!-- Aide au remplissage : consulter la section correspondante avec `obsindVD::open_aide_remplissage_help()` -->