#!/usr/bin/env python3 """Figure ch04 — structure du parc de logements : ménages privés selon le type de construction, Québec et Canada (parts), et mode d'occupation par type au Québec. DONNÉES RÉELLES : Statistique Canada, Recensement de 2021, tableau 98-10-0240-01 (WDS, data/raw). Sortie : assets/figures/ch04/ch04-fig-parc-types.pdf""" import sys, pathlib ROOT = pathlib.Path(__file__).resolve().parents[3] sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) import numpy as np, matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter from traite.style import setup, palette, savefig, LARGEUR import ch04_marches as cas def main(): setup() sp = cas.structure_parc().sort_values("qc_menages", ascending=True) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.3), gridspec_kw={"width_ratios": [1.15, 1]}) y = np.arange(len(sp)); h = 0.38 ax1.barh(y + h / 2, sp["qc_part"] * 100, h, color=palette.cat[0], label="Québec") ax1.barh(y - h / 2, sp["ca_part"] * 100, h, color=palette.cat[1], label="Canada") ax1.set_yticks(y); ax1.set_yticklabels(sp["court"]); ax1.set_xlabel("Part des ménages privés (%)") ax1.xaxis.set_major_formatter(FuncFormatter(lambda v, p: f"{v:.0f}")); ax1.legend(loc="lower right") for yi, (q, c) in enumerate(zip(sp["qc_part"], sp["ca_part"])): ax1.text(q * 100 + 0.6, yi + h / 2, f"{q*100:.1f}".replace(".", ","), va="center", fontsize=7, color=palette.ink) ax1.set_title("Type de construction", loc="left") prop = sp["qc_proprietaires"] / sp["qc_menages"] * 100; loc = sp["qc_locataires"] / sp["qc_menages"] * 100 ax2.barh(y, prop, 0.6, color=palette.cat[0], label="Propriétaires") ax2.barh(y, loc, 0.6, left=prop, color=palette.cat[2], label="Locataires") ax2.set_yticks(y); ax2.set_yticklabels([]); ax2.set_xlim(0, 100); ax2.set_xlabel("Ménages du type (%), Québec") ax2.axvline(59.9, color=palette.ink2, lw=0.7, ls=":"); ax2.text(60.8, len(sp) - 0.55, "59,9 % (ensemble)", fontsize=7, color=palette.ink2) for yi, p in enumerate(prop): ax2.text(min(p, 93) - 1.5, yi, f"{p:.0f}", va="center", ha="right", fontsize=7, color="white" if p > 12 else palette.ink) ax2.legend(loc="upper center", bbox_to_anchor=(0.5, -0.16), ncol=2, fontsize=7); ax2.set_title("Mode d'occupation, Québec", loc="left") fig.tight_layout(w_pad=1.0) out = savefig(fig, "ch04/ch04-fig-parc-types.pdf"); print("OK", out) if __name__ == "__main__": main()