#!/usr/bin/env python3 """Figure ch11 — frise INDICATIVE des pathologies et matériaux à risque selon la période de construction (Québec). Les bornes de périodes sont des repères de connaissances générales du métier (matériaux en usage, dates d'interdiction ou de normalisation) et non des statistiques : elles sont arrondies et signalées comme indicatives dans la légende. Les seules dates vérifiées sur une source publique sont marquées « (v) » dans le libellé : interdiction de la MIUF (déc. 1980, RNCan), interdiction de l'amiante (30 déc. 2018, Canada.ca), vermiculite Libby/Zonolite 1920-1990 (RNCan), fin du Programme pyrrhotite (30 sept. 2026, Québec.ca), Code de construction fondé sur le CNB 2020 modifié Québec (17 avril 2025, RBQ). Sortie : assets/figures/ch11/ch11-fig-frise-pathologies.pdf""" import sys, pathlib ROOT = pathlib.Path(__file__).resolve().parents[3] sys.path.insert(0, str(ROOT / "analysis/python")) import textwrap import matplotlib.pyplot as plt from traite.style import setup, palette, savefig, LARGEUR # (libellé, début, fin, famille) — période pendant laquelle le matériau ou la pratique à risque était couramment mis en place FRISE = [ ("Plomberie d'alimentation en acier galvanisé", 1900, 1960, "Plomberie"), ("Entrées d'eau en plomb (petits diamètres)", 1900, 1955, "Plomberie"), ("Fils électriques à boutons et tubes ; fusibles", 1900, 1950, "Électricité"), ("Isolants contenant de l'amiante (tuyaux, plâtre, carreaux) — interdiction 2018 (v)", 1920, 1985, "Isolation et air intérieur"), ("Vermiculite Zonolite (mine de Libby) — vente 1920-1990 (v)", 1920, 1990, "Isolation et air intérieur"), ("Réservoirs de mazout souterrains ou extérieurs d'origine", 1945, 1980, "Chauffage"), ("Filage de cuivre sans mise à la terre (deux fils)", 1945, 1962, "Électricité"), ("Filage d'aluminium (circuits de dérivation)", 1965, 1976, "Électricité"), ("Mousse isolante d'urée-formaldéhyde (MIUF) — interdite déc. 1980 (v)", 1970, 1980, "Isolation et air intérieur"), ("Remblai sous dalle susceptible de contenir de la pyrite (région de Montréal)", 1970, 1999, "Fondations et sols"), ("Tuyauterie de polybutylène (gris)", 1978, 1995, "Plomberie"), ("Fenêtres à simple vitrage ou à châssis de bois non étanches", 1900, 1980, "Enveloppe"), ("Toitures et drains français sans membrane ni cheminées de nettoyage (ocre)", 1900, 1995, "Fondations et sols"), ("Granulats à pyrrhotite dans le béton (Mauricie) — programme SHQ clos le 30 sept. 2026 (v)", 1996, 2008, "Fondations et sols"), ("Pare-vapeur et pare-air déficients, condensation dans les combles", 1975, 1995, "Enveloppe"), ("Construction sous le chapitre I fondé sur le CNB 2020 modifié Québec (v)", 2025, 2026, "Normes"), ] FAMILLES = ["Fondations et sols", "Enveloppe", "Isolation et air intérieur", "Plomberie", "Électricité", "Chauffage", "Normes"] def main(): setup() coul = {f: palette.cat[i] for i, f in enumerate(FAMILLES[:-1])}; coul["Normes"] = palette.ink2 ordre = sorted(FRISE, key=lambda r: (FAMILLES.index(r[3]), r[1])) fig, ax = plt.subplots(figsize=(LARGEUR, 5.2)) for k, (lib, d, f_, fam) in enumerate(ordre): ax.barh(k, f_ - d, left=d, height=0.62, color=coul[fam], alpha=0.9) ax.set_yticks(range(len(ordre))); ax.set_yticklabels(["\n".join(textwrap.wrap(r[0], 46)) for r in ordre], fontsize=6.3) ax.set_ylim(-0.7, len(ordre) - 0.3); ax.invert_yaxis() ax.set_xlim(1900, 2030); ax.set_xticks(range(1900, 2031, 20)); ax.tick_params(axis="x", labelsize=7) ax.set_xlabel("Période de mise en place (repères indicatifs arrondis ;\ndates marquées (v) : vérifiées sur une source publique)", fontsize=7.5) ax.axvline(1998, color=palette.brand, lw=0.9, ls="--"); ax.text(1996.5, len(ordre) - 0.6, "sujet cas 1 : 1998", fontsize=7, color=palette.brand, va="center", ha="right") ax.grid(axis="y", visible=False) from matplotlib.patches import Patch fig.legend(handles=[Patch(color=coul[f], label=f) for f in FAMILLES], loc="lower center", ncol=4, fontsize=6.6, frameon=False, bbox_to_anchor=(0.5, -0.01)) ax.spines["left"].set_visible(False) fig.tight_layout(rect=(0, 0.06, 1, 1)) out = savefig(fig, "ch11/ch11-fig-frise-pathologies.pdf"); print("OK", out) if __name__ == "__main__": main()