Parc de logements au 1er janvier 2026 - if388

Données - INSEE

Figure 1 : parc de logements en 1982 et en 2026

Code
fig1 |>
  filter(zone == "France hors Mayotte", categorie != "Ensemble",
         indicateur %in% c("logements_1982", "logements_2026")) |>
  mutate(annee = recode(indicateur, logements_1982 = "1982", logements_2026 = "2026"),
         categorie = fct_relevel(categorie, names(categories_couleurs))) |>
  ggplot(aes(x = annee, y = valeur / 1000, fill = categorie)) +
  geom_col(position = "stack") +
  scale_fill_manual(values = categories_couleurs, name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "Millions de logements",
       title = "Parc de logements",
       subtitle = "France hors Mayotte, 1982 vs. 2026") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(ncol = 1))

Figure 2 : évolution du nombre de logements et de la population depuis 1982

Code
fig2 |>
  ggplot(aes(x = annee, y = valeur, color = indicateur)) +
  geom_line(linewidth = 1) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "Base 100 en 1982",
       title = "Évolution du nombre de logements et de la population",
       subtitle = "France hors Mayotte, depuis 1982") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 2))

Figure 3 : répartition du parc par catégorie de logement depuis 1982

Code
fig3 |>
  mutate(categorie = fct_relevel(categorie, names(categories_couleurs))) |>
  ggplot(aes(x = annee, y = valeur / 100, fill = categorie)) +
  geom_area(position = "stack") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_manual(values = categories_couleurs, name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Répartition du parc de logements",
       subtitle = "par catégorie, depuis 1982") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(ncol = 1))

Figure 4 : part de l’habitat individuel par catégorie depuis 1982

Code
fig4 |>
  ggplot(aes(x = annee, y = valeur / 100, color = categorie)) +
  geom_line(linewidth = 1) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_color_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = NULL,
       title = "Part de l'habitat individuel",
       subtitle = "par catégorie de logement, depuis 1982") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 1))

Figure 5 : résidences principales par statut d’occupation depuis 1982

Code
fig5 |>
  filter(statut %in% c("Ensemble des propriétaires", "Ensemble des locataires", "Logés gratuitement")) |>
  ggplot(aes(x = annee, y = valeur / 100, fill = statut)) +
  geom_area(position = "stack") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Statut d'occupation des résidences principales",
       subtitle = "depuis 1982") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Code
fig5 |>
  filter(statut %in% c("Propriétaires sans charge de remboursement", "Accédants à la propriété",
                        "Bailleurs publics", "Bailleurs privés")) |>
  ggplot(aes(x = annee, y = valeur / 100, color = statut)) +
  geom_line(linewidth = 1) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = NULL,
       title = "Détail du statut d'occupation des résidences principales",
       subtitle = "depuis 1982") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 1))

Figure 6 : répartition des logements par taille d’unité urbaine (2026)

Code
taille_ordre <- c("Unité urbaine de Paris", "Unités urbaines de 100 000 habitants ou plus (hors Paris)",
                   "Unités urbaines de moins de 100 000 habitants", "Communes hors unité urbaine",
                   "Ensemble des communes")
fig6 |>
  mutate(taille_uu = fct_relevel(taille_uu, taille_ordre),
         categorie = fct_relevel(categorie, names(categories_couleurs))) |>
  ggplot(aes(x = taille_uu, y = valeur / 100, fill = categorie)) +
  geom_col(position = "stack") +
  coord_flip() +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_manual(values = categories_couleurs, name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = NULL,
       title = "Répartition des logements par catégorie",
       subtitle = "selon la taille de l'unité urbaine, au 1er janvier 2026") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(fill = guide_legend(ncol = 1))

Tableau complémentaire : logements par type d’habitat et taille d’unité urbaine

Code
tc |>
  filter(taille_uu != "Ensemble des communes", type_habitat != "Ensemble",
         categorie == "ensemble_logements") |>
  mutate(taille_uu = fct_relevel(taille_uu, taille_ordre)) |>
  ggplot(aes(x = taille_uu, y = valeur / 1000, fill = type_habitat)) +
  geom_col(position = "fill") +
  coord_flip() +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_manual(values = c("Individuel" = "#1B3F8B", "Collectif" = "#E8737A"), name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = NULL,
       title = "Part de l'habitat individuel vs. collectif",
       subtitle = "selon la taille de l'unité urbaine, au 1er janvier 2026") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())