donnees <- donnees %>%
filter(
Pays %in% c("France", "Zone euro"),
Année >= 2000
) %>%
mutate(
Pays = factor(Pays, levels = c("France", "Zone euro")),
Année = as.integer(Année)
)
# Moyennes hors 2020 (2000–2024 sauf 2020)
moyennes <- donnees %>%
# filter(Année != 2020) %>%
group_by(Pays, Variable) %>%
summarise(moyenne = mean(Valeur, na.rm = TRUE), .groups = "drop") %>%
mutate(linetype = "Moyenne")
# Étendre moyennes sur toutes les années 2000–2024
annees_seq <- seq(2000, 2024, by = 1)
moyennes_long <- moyennes %>%
group_by(Pays, Variable, linetype) %>%
summarise(Année = list(annees_seq), .groups = "drop") %>%
tidyr::unnest(cols = c(Année)) %>%
left_join(moyennes, by = c("Pays", "Variable", "linetype")) %>%
select(Pays, Variable, Année, moyenne, linetype)
# Flèches d’écart 2019 et 2024
valeurs_annees <- donnees %>%
filter(Année %in% c(2019, 2024), Variable %in% c("Dépenses des APU", "Recettes des APU")) %>%
select(Pays, Année, Variable, Valeur) %>%
tidyr::pivot_wider(names_from = Variable, values_from = Valeur) %>%
rename(Depenses = `Dépenses des APU`, Recettes = `Recettes des APU`) %>%
mutate(
ecart = Recettes - Depenses,
label_ecart = paste0(format(round(ecart, 1), nsmall = 1), if_else(abs(ecart) >= 2, "%", "%")),
x_arrow = Année,
y_start = Depenses,
y_end = Recettes,
x_text = ifelse(Année == 2019, 2018.7, 2024.2),
hjust_text = ifelse(Année == 2019, 1, 0)
) %>%
mutate(
# Décalage vertical spécifique pour 2019
y_text = (y_start + y_end) / 2 +
case_when(
Pays == "France" & Année == 2019 ~ 0.4, # texte France 2019 plus haut
Pays == "Zone euro" & Année == 2019 ~ 0.05, # texte Zone euro 2019 plus bas
TRUE ~ 0
)
)
# Flèche pour l’année 2000
valeurs_annees_2000 <- donnees %>%
filter(Année == 2000, Variable %in% c("Dépenses des APU", "Recettes des APU")) %>%
select(Pays, Année, Variable, Valeur) %>%
tidyr::pivot_wider(names_from = Variable, values_from = Valeur) %>%
rename(Depenses = `Dépenses des APU`, Recettes = `Recettes des APU`) %>%
mutate(
ecart = Recettes - Depenses,
label_ecart = paste0(format(round(ecart, 1), nsmall = 1), if_else(abs(ecart) >= 2, "%", "%")),
x_arrow = 2000,
y_start = Depenses,
y_end = Recettes,
x_text = 1999.8,
y_text = (y_start + y_end) / 2,
hjust_text = 1
)
# Flèche pour l’année 2007
valeurs_annees_2007 <- donnees %>%
filter(Année == 2007, Variable %in% c("Dépenses des APU", "Recettes des APU")) %>%
select(Pays, Année, Variable, Valeur) %>%
tidyr::pivot_wider(names_from = Variable, values_from = Valeur) %>%
rename(Depenses = `Dépenses des APU`, Recettes = `Recettes des APU`) %>%
mutate(
ecart = Recettes - Depenses,
label_ecart = paste0(format(round(ecart, 1), nsmall = 1), if_else(abs(ecart) >= 2, "%", "%")),
x_arrow = 2007,
y_start = Depenses,
y_end = Recettes,
x_text = 2006.3,
y_text = ifelse(Pays == "France", (Depenses + Recettes) / 2 + 0.5, (Depenses + Recettes) / 2),
hjust_text = 1
)
# Flèche pour l’année 2011
valeurs_annees_2011 <- donnees %>%
filter(Année == 2011, Variable %in% c("Dépenses des APU", "Recettes des APU")) %>%
select(Pays, Année, Variable, Valeur) %>%
tidyr::pivot_wider(names_from = Variable, values_from = Valeur) %>%
rename(Depenses = `Dépenses des APU`, Recettes = `Recettes des APU`) %>%
mutate(
ecart = Recettes - Depenses,
label_ecart = paste0(format(round(ecart, 1), nsmall = 1), if_else(abs(ecart) >= 2, "%", "%")),
x_arrow = 2011,
y_start = Depenses,
y_end = Recettes,
x_text = 2011.1, # inversé pour texte à gauche
hjust_text = 0
) %>%
mutate(
# Décalage vertical du texte pour Zone euro
y_text = (y_start + y_end) / 2 + if_else(Pays == "Zone euro", 0.3, 0)
)
# Couleurs principales
couleurs_principales <- c("Dépenses des APU" = prettycols("Joyful")[[1]], "Recettes des APU" = prettycols("Joyful")[[2]])
donnees <- donnees |>
mutate(
tooltip = glue("<b>{Pays}</b><br>{Variable} en {Année}<br>{round(Valeur,1)} points de PIB")
)
# Tracé final
gg <- ggplot() +
# Courbes principales
geom_line(data = donnees,
aes(x = Année, y = Valeur, color = Variable), linewidth = 0.5) +
geom_point_interactive(
data = donnees,
aes(x = Année, y = Valeur, fill = Variable,
tooltip = tooltip, data_id = Année),
shape = 21, color = "white", size = 1., hover_nearest = TRUE)+
# Moyennes en pointillés
geom_line(data = moyennes_long, aes(x = Année, y = moyenne, color = Variable, linetype = linetype),
linewidth = 0.5, alpha = 0.4) +
# Flèches et labels pour 2019 et 2024
geom_segment(data = valeurs_annees, aes(x = x_arrow, xend = x_arrow, y = y_start, yend = y_end),
arrow = arrow(angle = 30, ends = "both", length = unit(0.12, "cm"), type = "closed"),
color = "black", linewidth = 0.2) +
geom_text(data = valeurs_annees, aes(x = x_text, y = y_text, label = label_ecart, hjust = hjust_text),
size = text_size, size.unit = "pt") +
# Flèche et label pour 2000
geom_segment(data = valeurs_annees_2000, aes(x = x_arrow, xend = x_arrow, y = y_start, yend = y_end),
arrow = arrow(angle = 30, ends = "both", length = unit(0.12, "cm"), type = "closed"),
color = "black", linewidth = 0.2) +
geom_text(data = valeurs_annees_2000, aes(x = x_text, y = y_text, label = label_ecart, hjust = hjust_text),
size = text_size, size.unit = "pt") +
# Flèche et label pour 2007
geom_segment(data = valeurs_annees_2007, aes(x = x_arrow, xend = x_arrow, y = y_start, yend = y_end),
arrow = arrow(angle = 30, ends = "both", length = unit(0.12, "cm"), type = "closed"),
color = "black", linewidth = 0.2) +
geom_text(data = valeurs_annees_2007, aes(x = x_text, y = y_text, label = label_ecart, hjust = hjust_text),
size = text_size, size.unit = "pt") +
# Flèche et label pour 2011
geom_segment(data = valeurs_annees_2011, aes(x = x_arrow, xend = x_arrow, y = y_start, yend = y_end),
arrow = arrow(angle = 30, ends = "both", length = unit(0.12, "cm"), type = "closed"),
color = "black", linewidth = 0.2) +
geom_text(data = valeurs_annees_2011, aes(x = x_text, y = y_text, label = label_ecart, hjust = hjust_text),
size = text_size, size.unit = "pt") +
# Facettage par pays
facet_wrap(~ Pays, ncol = 2) +
# Échelles
scale_x_continuous(
breaks = date_breaks(5),
minor_breaks = breaks_width(1),
labels = date1,
expand = expansion(add = c(3, 3))
) +
scale_color_manual(
values = couleurs_principales,
aesthetics = c("fill", "color"),
name = NULL
) +
scale_linetype_manual(
values = c("Moyenne" = "dashed"),
labels = c("Moyenne sur la période (en pointillés)"),
name = NULL
) +
# Labels axes
labs(
x = NULL,
y = "% du PIB"
) +
# Thème OFCE
theme_ofce() +
theme(
legend.position.inside = c(0.97,0.97),
legend.justification = c(1,1),
legend.direction = "vertical",
strip.text = element_marquee(size = rel(0.9)) ) +
guides(
color = guide_legend(order = 1, nrow = 1),
fill = "none",
linetype = guide_legend(order = 2, nrow = 1),
x = guide_axis(minor.ticks = TRUE) )+
ofce_caption("INSEE, Eurostat")
girafy(gg, r=1.75)